代码之家  ›  专栏  ›  技术社区  ›  Nino Filiu

promise.all的类型定义与文档不匹配

  •  1
  • Nino Filiu  · 技术社区  · 7 年前

    看着 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<T1> , all<T1, T2> 一直到 all<T1, T2, ..., T9, T10> .

    但是,这与 承诺所有 ,可以将长度超过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,这就引出了一个问题:

    为什么承诺的类型定义都不匹配 its documentation 也不是它的实施?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Patrick Roberts Benjamin Gruenbaum    7 年前

    最多10个类型的泛型声明只说明不统一的“元组”,或者不同索引具有显式独立类型的数组。

    也有 a declaration that supports a uniformly typed array 无边界长度:

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

    使用长度不超过10的元组的声明应该覆盖合理数量的用例,并且由于typescript作为语言的限制,因为元组的泛型类型推断是一个包含 union type ,将使用上面的签名。在其他语言(如C_)中,这些类型的非齐次类型任意绑定的泛型声明也很常见。例如, Action<> Func<> 最多使用16种参数类型。

    推荐文章