第 1 部分
有一些功能你需要了解 A)Promise.all 和 B)Promise.then:
A)Promise.all的类型定义是一个函数:
all<T>(values: readonly (T | PromiseLike<T>)[]): Promise<T[]>;
B) Promise.then 的类型定义是一个稍微复杂一点的函数:
then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
第 1 部分.a
Promise.then的类型定义很多但是可以分解成小部分:
then<TResult1 = T, TResult2 = never> 一个函数 then 和 2 个泛型 TResult1, TResult2。 < > 意味着我们可以稍后在其中设置和使用值——它们被称为generics。
then 函数本身:(onfulfilled?: ..., onrejected?: ...): Promise<TResult1 | TResult2>。
PromiseLike 是一个辅助类型,与Promise 相同(用于介绍课程)。
onfulfiled 和 onrejected 是以下形式的函数:(value: T) => (TResult1 OR PromiseLike<TResult1>) OR undefined OR null。注意这里使用了通用的T。
第 2 部分 -
Promise 本身有一个通用接口:interface Promise<T>。 <T> 是一个/generic。
所以当你打电话时
Promise.all<SomeCoolType>([a(), b(), c()]).then( value => doSomething(value) )
你的泛型是SomeCoolType,在这个例子中一些很酷的类型是
interface SomeCoolType = [A() => string, B() => boolean, C() => number]
现在请记住,A B C 必须是 Promise。这样一来,.then( value => ... 中的 value 将成为 SomeCoolType 的结果,对我们来说,它调用了所有这些函数,结果是 [string, boolean, number]。
结论 -
具体来说,您传递给您的函数/承诺数组Promise.all<T> 是.then(result => ...) 中使用的泛型。这些承诺的返回/解析值将成为result 的值/类型。
示例:Promise.all<[Promise<() => string>]>([returnStringAsync()]).then(result => console.log(typeof result === "string")); # => true