我正在为如何使用 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
但我无法完全解决。
这是我能想到的最好的,但没有编译...
type DataFromDataProvider<TDataProvider extends DataProvider<TData>> = TData;
type DataFromDataProviders<TDataProviders extends DataProviders> = {
[K in keyof TDataProviders]: DataFromDataProvider<TDataProviders[K]>;
}
我正在努力想出一种DataFromDataProvider
无需我作为第二个参数显式传入即可编译的类型,TData
我认为我做不到。
任何帮助将不胜感激。