@toly19

Как задекларировать аргумент с масивом функций и промисов?

Не могу понять, как задекларировать аргумент функции, который является массивом функций, каждая из которых возвращает промис. Вот моя попытка декларации(не работает)
function anyFunc(inputFunctions: (<T>() => Promise<T>)[]) {
    return Promise.all(inputFunctions.map(value => value()));
}

использовать вот так:
anyFunc([() => Promise.resolve(1), () => Promise.resolve("a")]).then(value => {
    console.log(value); //[1, "a"]
});


тоесть в итоге ts должен знать, что за значения находятся в value

сама ошибка:
Type 'Promise<string>' is not assignable to type 'Promise<T>'.
  Type 'string' is not assignable to type 'T'.
  • Вопрос задан
  • 328 просмотров
Решения вопроса 1
@forspamonly2
type PromiseCallResults<T> = {
	[P in keyof T]: T[P] extends (() => Promise<infer R>) ? R : never;
}

function anyFunc<T extends (()=>Promise<unknown>)[]>(...inputFunctions: T) {
	return Promise.all(inputFunctions.map(value => value())) as Promise<PromiseCallResults<T>>;
}

anyFunc(() => Promise.resolve(1), () => Promise.resolve("a")).then(value => {
	console.log(value); //[1, "a"]

	const checktypes:[number, string] = value;
});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы