即使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[]
,但您应该小心。
无论如何希望这会有所帮助。祝你好运!