gpt4 book ai didi

TypeScript,如何键入将 Promise[] 转换为 Promise 的函数?

转载 作者:行者123 更新时间:2023-12-05 03:27:33 26 4
gpt4 key购买 nike

假设我有一些功能,例如:

function allPromises<T>(array: Promise<T>[]): Promise<T[]> {
return Promise.all(array);
}

(注意:这是有意设计的,以实现最低限度的可重现性)

如果我这样做,效果很好:

const p1: Promise<string> = new Promise((resolve) => resolve('1'));
const p2: Promise<string> = new Promise((resolve) => resolve('2'));
const test1 = [p1, p2];
const res1 = allPromises(test1);

没有类型错误和res1正确输入为 Promise<string[]> ;

但如果我这样做:

const p1: Promise<string> = new Promise((resolve) => resolve('1'));
const p2: Promise<number> = new Promise((resolve) => resolve(2));
const test2 = [p1, p2];
const res2 = allPromises(test2);

现在我收到 TS 投诉:

Argument of type '(Promise<string> | Promise<number>)[]' is not assignable to parameter of type 'Promise<string>[]'.

好像是因为test2键入为 (Promise<number> | Promise<string>)[]

我可以通过以下方式解决这个问题:

const test2: Promise<string | number>[] = [p1, p2];

然后 res2正确输入为 Promise<(string | number)[]>

但是有没有一种方法可以键入我的函数,以便它可以正确地推断出类型,而不是强制我以这种方式显式声明数组的类型?

注意:我也试过重载类似于 Promise.all 的函数输入已完成,但它也失败了,需要我明确输入数组以便 TS 接受它:

function allPromises<T1, T2>(array: [Promise<T1>, Promise<T2>]): Promise<[T1, T2]>
function allPromises<T>(array: Promise<T>[]): Promise<T[]>
function allPromises(array: Promise<unknown>[]): Promise<unknown[]> {
return Promise.all(array);
}

而且这个重载也没有帮助:

function allPromises<T1, T2>(array: (Promise<T1> | Promise<T2>)[]): Promise<(T1 | T2)[]>

我希望在 TS V3 中实现这一点……我看到 V4.5+ 中的一些新类型对此很有用,但我暂时还停留在 V3 中。

最佳答案

我让它工作

type UnwrapPromiseArr<T> = T extends Promise<infer R>[]
? Promise<R[]>
: never;

function allPromises<T extends Promise<unknown>[]>(array: T): UnwrapPromiseArr<T> {
return Promise.all(array) as UnwrapPromiseArr<T>;
}

它们的关键是推断最初来自内部数组的联合类型。

Playground

关于TypeScript,如何键入将 Promise<T>[] 转换为 Promise<T[]> 的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71453245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com