Tìm kiếm trang web

Gặp khó khăn trong việc suy luận kiểu với Typescript


Tôi đang cố gắng tạo một giao diện cho cơ sở dữ liệu Realm của mình bằng TypeScript.

Về cơ bản, tôi có một bot tự động và tôi muốn theo dõi cách mọi người đang sử dụng nó và mức độ sử dụng. Vì lý do đó, tôi đã tạo một số sơ đồ mà tôi muốn thêm vào cơ sở dữ liệu nội bộ và có thể lấy lại thông tin sau này.

Vì vậy, tôi đã tạo một giao diện cho cơ sở dữ liệu realm này. Ý tưởng là tôi cung cấp thực thể mà mình muốn thêm hoặc khôi phục và Typescript sẽ trả về đối tượng thực thể đó dưới dạng kiểu trả về.

Tôi đã định nghĩa các mô hình của các đối tượng thực thể như sau:

export type AllEntitiesModel = {
    copypastas: {
        group: string;
        requester: string;
    };
    googleSearches: {
        group: string;
        requester: string;
        query: string;
    };
};

Và tôi đã tạo một enum chứa tất cả các loại thực thể của mình:

export enum EntityTypes {
    COPYPASTAS = 'copypastas',
    GOOGLESEARCHES = 'googleSearches',
}

Nếu tôi tạo một kiểu như

type CopypastaModel = AllEntitiesModel[EntityTypes.COPYPASTAS];

Nó hoạt động, nó biết rằng Mô hình Copypasta nên được

copypastas: {
    group: string;
    requester: string;
};

Điều tôi đang cố gắng đạt được là có một hàm có thể làm điều này nhưng từ loại của đối số mà tôi đang truyền vào nó.

Tôi sẽ có một hàm với chữ ký lý tưởng sẽ như thế này

function getAllEntities(entityType: EntityTypes) => AllEntitiesModel[entityType]

nơi mà entityType này là một đối số mà tôi truyền vào hàm. Nói cách khác, tôi muốn TypeScript biết rằng nếu tôi gọi getAllEntities(EntityTypes.COPYPASTAS) tôi mong đợi nó trả về một đối tượng có kiểu AllEntitiesModel.copypasta và nếu tôi gọi getAllEntities(EntityTypes.GOOGLESEARCHES) tôi mong đợi nó trả về một đối tượng có kiểu AllEntitiesModel.googleSearch

Tôi đã thử nhiều thứ nhưng không thành công. Tôi đã tìm kỹ tài liệu TypeScript nhưng không tìm thấy gì giống như vậy. Bất kỳ sự giúp đỡ nào cũng được trân trọng ;)

Câu trả lời #1

Bạn sẽ cần xác định tham số kiểu tổng quát bị giới hạn trong các khóa được phép:

declare function getAllEntities<T extends keyof AllEntitiesModel>(entityType: T): AllEntitiesModel[T]

Điều này cho phép Typescript thu hẹp kiểu trả về theo khóa được cung cấp.

Sân chơi

Ở đây chúng ta sử dụng suy luận tham số kiểu — nghĩa là, chúng ta muốn trình biên dịch tự động đặt giá trị của T cho chúng ta dựa trên kiểu của đối số mà chúng ta truyền vào

Vì vậy, ví dụ trong lệnh gọi getAllEntities(EntityTypes.COPYPASTAS), kiểu của T sẽ được suy ra là EntityTypes.COPYPASTAS (tức là "copypastas") và kiểu giá trị trả về sẽ được xác định là AllEntitiesModel["copypastas"].