Я борюсь с тем, как сильно напечатать некоторые функции с помощью 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
в качестве второго параметра, что я не думаю, что смогу сделать.
Любая помощь будет принята с благодарностью.
[K in K2]
, где K2 - это нечто иное, чем массив. Результирующий тип - это именно то, что мне нужно, но код не работает. При таком подходе теряются физические имена поставщиков данных. Я мог бы заставить каждого провайдера возвращать свои имена, но я хочу, чтобы это было СУХОЕ. - person CodeAndCats   schedule 05.06.2017[K1 in K2]
немного больше и понял, чтоK2
не массив, а объединение строковых значений, и отдельная строка может считаться объединением только с одним значением в наборе. Теперь имеет больше смысла. - person CodeAndCats   schedule 06.06.2017