Прежде всего, ваша ошибка Element implicitly has an 'any' type because type { ... } has no index signature
связана с тем, что Object.keys()
возвращает массив строк , а apiFactories[f]
, где f
может быть любой строкой, приводящей к неявному any
результату, что запрещено в режиме strict
(в частности, noImplicitAny
). Вы можете исправить это с утверждением от f
до keyof typeof apiFactories
.
Помимо этого я не думаю, что reduce()
сможет сделать вывод, что вы хотите. Вы передаете {}
в качестве начального значения, поэтому тип возвращаемого значения выводится как {}
. Тем не менее, вы можете использовать тип карты для описания вашего API:
type ApiFactories = typeof apiFactories;
type Api = { [P in keyof ApiFactories]: ReturnType<ApiFactories[P]> };
Теперь вы можете утверждать начальное значение как Api
и / или передавать аргумент типа в reduce<Api>()
, и вы должны получить желаемый тип объекта:
const generateApiMethods = () =>
Object.keys(apiFactories).reduce(
(acc, f, i) => ({ ...acc, [f]: apiFactories[f as keyof Api](i) }),
{} as Api
);
const api = generateApiMethods();
api.fetchSomething(query).then(...)
api.fetchSomeOtherThing(123).then(...)