我正在努力如何用TypeScript強類型化一些功能。TypeScript泛型
本質上,我有一個函數接受DataProviders的鍵/值映射,並返回從每個返回的數據的鍵/值映射。這裏的問題的一個簡化版本:
interface DataProvider<TData> {
getData(): TData;
}
interface DataProviders {
[name: string]: DataProvider<any>;
}
function getDataFromProviders<TDataProviders extends DataProviders>(
providers: TDataProviders): any {
const result = {};
for (const name of Object.getOwnPropertyNames(providers)) {
result[name] = providers[name].getData();
}
return result;
}
目前getDataFromProviders
有any
返回類型,但我想它,這樣如果調用是這樣的...
const values = getDataFromProviders({
ten: { getData:() => 10 },
greet: { getData:() => 'hi' }
});
...然後values
會隱式強類型爲:
{
ten: number;
greet: string;
}
我想這將涉及與TDataProviders
b的泛型參數返回一個泛型類型我不能解決這個問題。
這是最好的我能想出但不編譯...
type DataFromDataProvider<TDataProvider extends DataProvider<TData>> = TData;
type DataFromDataProviders<TDataProviders extends DataProviders> = {
[K in keyof TDataProviders]: DataFromDataProvider<TDataProviders[K]>;
}
我竭力想出,沒有我在TData
明確地傳遞作爲第二個參數編譯一個DataFromDataProvider
類型,我認爲我不能這樣做。
任何幫助將不勝感激。
如果提供程序的數量是固定的並且相對較小(<= 10),則可以通過更改getDataFromProviders以使用可變參數,使用幻像類型對密鑰進行編碼(「ten」,「greet」 )。許多樣板,但它給你想要的:https://gist.github.com/evansb/7afc5ac7e640a06759276f456970e857 –
謝謝@EvanSebastian,這是一個有趣的方法。我不知道你可以寫出'[K in K2]',其中K2不是數組。結果類型正是我想要的,但代碼不起作用。這種方法失去了數據提供者的物理名稱。我可以讓每個提供者返回他們的名字,但我想保持乾爽。 – CodeAndCats
哦,我只是複製粘貼你的代碼,你需要明顯修改它。我應該把實施留空,我的壞處。 是的,不幸的是,不可能讓每個提供者返回它們的類型,並從中獲得一個字符串文字類型。我相信你需要存在型 –