0

我想使用元组类型为 promise.all 创建一个包装器。我正要写这样的东西:

export function parallerRequest<TResponses extends any[]>(urls: string[]): Promise<TResponses> {
    return Promise.all<TResponses>(urls.map((url) => fetch(url)));
}

预期的行为应该是当 Promise.all 将被解析时,返回的数据将采用提供的元组的形式。任何想法如何实现这种行为?

4

1 回答 1

0

即使Promise.all()对元组类型进行了适当的映射(至少在 TypeScript 3.1 发布之前不支持fetch),问题是编译器无法验证映射的结果是否urls会导致类型的值TResponses. 它所知道的是它将是类型Response[],它比TResponses. 因此Promise.all返回一个Promise<Response[]>. 如果您想告诉编译器不要担心,可以使用类型断言

export function parallelRequest<TResponses extends Response[]>(
  urls: string[]
): Promise<TResponses> {
    return Promise.all(urls.map(x => fetch(x))) as Promise<TResponses>; // okay
}

这行得通。但请注意,编译器警告是一个很好的警告。例如,您的签名中的任何parallelRequest()内容都不会保证urls与 的长度相同TResponses,或者有人不会Response为 的元素传递 的子类型TResponses

interface CustomResponse extends Response {
    prop: string;
}
parallelRequest<[Response, CustomResponse, Response]>(["/foo/bar", "/baz"]); // no error

所以这不是真正的类型安全。我不确定您的用例是用于指定TResponses而不是仅仅离开它Response[],但您应该小心。

无论如何希望这会有所帮助。祝你好运!

于 2018-08-21T13:58:54.183 回答