【问题标题】:Type definition of Promise.all doesn't match with the docsPromise.all 的类型定义与文档不匹配
【发布时间】:2019-07-05 08:26:08
【问题描述】:

查看the type definition of Promise.all,我看到了10个定义:

/**
 * Creates a Promise that is resolved with an array of results when all of the provided Promises
 * resolve, or rejected when any Promise is rejected.
 * @param values An array of Promises.
 * @returns A new Promise.
 */
all<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>;

我只包含了一个长度为 3 的数组,但也存在all&lt;T1&gt;all&lt;T1, T2&gt;,一直到all&lt;T1, T2, ..., T9, T10&gt;

但是,这与 Promise.all 的实现不匹配,它可以将长度超过 10 的数组作为输入:

let myPromise = num => Promise.resolve(num);
let myPromisesArray = (new Array(20))
  .fill()
  .map((_,i) => myPromise(i));
Promise.all(myPromisesArray).then(console.log)

我不是世界上最差的开发人员,但我仍然假设制作 ES2015 类型定义的微软开发人员比我更了解 JS/TS,这就引出了一个问题:

为什么 Promise.all 的类型定义既不匹配 its documentation 也不匹配它的实现?

【问题讨论】:

  • 我猜他们不想为无限值写all。那将是很多打字。
  • 哦,好吧,那么限制是 TypeScript 不能键入数组的每个元素?
  • 它可以,只要有足够的时间和足够大的硬盘来写出所有类型。最后一个声明,all&lt;T&gt;(values: (T | PromiseLike&lt;T&gt;)[]): Promise&lt;T[]&gt;;,采用了一个无限大小的数组。它仅限于在数组中仅使用一种类型。所有其他声明采用不同的类型。
  • 我从未将Promise.all 与具有两个或三个以上元素的混合类型数组一起使用......而且我已经写了一些JS......所以Promise.all 实际上有非常非常罕见的用例有 10 多种不同的类型,在这种情况下,您可以添加自己的类型。

标签: javascript typescript ecmascript-6 promise es6-promise


【解决方案1】:

最多 10 种类型的泛型声明仅考虑非统一“元组”或不同索引具有显式独立类型的数组。

还有无限长的a declaration that supports a uniformly typed array

all<T>(values: (T | PromiseLike<T>)[]): Promise<T[]>;

使用长度不超过 10 的元组的声明应该涵盖合理数量的用例,这是由于 TypeScript 作为一种语言的限制,因为元组的泛型类型推断是一个统一的数组包含union type,它将使用上面的签名。这种类型的泛型声明,直至非同质类型的任意边界,在其他语言(如 C#)中也很常见。例如,Action&lt;&gt;Func&lt;&gt; 使用 16 种参数类型的限制。

【讨论】:

  • 泛型类型列表会很有趣,但是用例可能非常罕见......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 2019-01-11
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多