Задать вопрос
@freshlemon

Как для возвращаемого типа функции задать типы входных параметров Function[]?

Возникла потребность вынести это (тут data и opfs имеют типы IApiAccount | IApiOpf[] | undefined):

const [data, opfs] = await Promise.all(
	[apiGetAccountMe, apiGetOpfList].map(method => method().then(res => res))
)

В отдельную экспортируемую функцию:

export const fetchPromiseAll = async (functions: Function[], data?: any[]): Promise<any[]> => {
	return await Promise.all(
		functions.map(func =>
			func(data ? data[functions.findIndex(x => x === func)] : undefined).then(
				(res: any) => res
			)
		)
	)
}

const [data, opfs] = await fetchPromiseAll([apiGetAccountMe, apiGetOpfList])

Тут data и opfs теперь имеют тип any.

Promise<any[]> - тип, который fetchPromiseAll указывает мне неявно (в примере указал для большей информативности). Как ожидать в ответ от этой функции интерфейсы передаваемых в параметр functions функций[]?
  • Вопрос задан
  • 101 просмотр
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Как-то так, если по красоте:
type Returns<T extends readonly Function[]> = {
  -readonly [K in keyof T]: T[K] extends (...args: any[]) => PromiseLike<infer R> ? R : never;
};

type Arguments<T extends readonly Function[]> = {
  [K in keyof T]?: T[K] extends (args: infer R, ...a: any[]) => any ? R : never;
};

function fetchAll<T extends readonly Function[]>(functions: readonly [...T], data?: Arguments<T>): Promise<Returns<T>> {
  return Promise.all(
    functions.map((func, index) => func(data?.[index]))
  ) as Promise<Returns<T>>;
}

const x = fetchAll([
  (a:66) => Promise.resolve(42),
  (f:string) => Promise.resolve('hello'),
  () => Promise.resolve(true),
], [66, '1ff']);


Если надо отельный массив, то придётся его руками const:
const arr = [
  (a:66) => Promise.resolve(42),
  (f:string) => Promise.resolve('hello'),
  () => Promise.resolve(true),
] as const;

const x = fetchAll(arr, [66, '1ff']);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы