我正在嘗試使用打字稿為我的領域資料庫創建一個介面。
基本上我有一個自動化機器人,我想跟蹤人們如何使用它以及使用了多少。為此,我制作了一些我想添加到內部資料庫中的模式,以便以后能夠恢復資訊。
所以我為這個領域資料庫做了一個介面。這個想法是我提供我想要添加或恢復的物體,Typescript 會給我物體物件作為回傳型別。
我將物體物件的模型定義如下:
export type AllEntitiesModel = {
copypastas: {
group: string;
requester: string;
};
googleSearches: {
group: string;
requester: string;
query: string;
};
};
我制作了一個包含我所有物體型別的列舉:
export enum EntityTypes {
COPYPASTAS = 'copypastas',
GOOGLESEARCHES = 'googleSearches',
}
如果我創建一個型別
type CopypastaModel = AllEntitiesModel[EntityTypes.COPYPASTAS];
它有效,它知道 CopypastaModel 應該是
copypastas: {
group: string;
requester: string;
};
我想要完成的是擁有一個可以執行此操作的函式,但是根據我傳遞給它的引數型別。
我會有一個帶有這個簽名的函式
function getAllEntities(entityType: EntityTypes) => AllEntitiesModel[entityType]
這entityType是我傳遞給函式的引數。換句話說,我希望 typscript 知道,如果我打電話,getAllEntities(EntityTypes.COPYPASTAS)我希望它回傳一個帶有型別的物件,AllEntitiesModel.copypasta如果我打電話,getAllEntities(EntityTypes.GOOGLESEARCHES)我希望它回傳一個帶有型別的物件AllEntitiesModel.googleSearch
我嘗試了很多事情都沒有成功。我已經翻閱了打字稿檔案,但沒有發現類似的東西。任何幫助表示贊賞;)
uj5u.com熱心網友回復:
您需要定義僅限于允許的鍵的泛型型別引數:
declare function getAllEntities<T extends keyof AllEntitiesModel>(entityType: T): AllEntitiesModel[T]
這允許 Typescript 根據提供的鍵縮小回傳型別。
操場
這里我們使用型別引數推斷——也就是說,我們希望編譯器根據我們傳入的引數型別
T自動為我們設定值
因此,例如在呼叫中,getAllEntities(EntityTypes.COPYPASTAS)的型別T將被推斷為EntityTypes.COPYPASTAS(即"copypastas"),而回傳值型別將被決議為AllEntitiesModel["copypastas"]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/368252.html
