typescript - 元组类型的 Promise.all 包装器
问题描述
我想使用元组类型为 promise.all 创建一个包装器。我正要写这样的东西:
export function parallerRequest<TResponses extends any[]>(urls: string[]): Promise<TResponses> {
return Promise.all<TResponses>(urls.map((url) => fetch(url)));
}
预期的行为应该是当 Promise.all 将被解析时,返回的数据将采用提供的元组的形式。任何想法如何实现这种行为?
解决方案
即使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[]
,但您应该小心。
无论如何希望这会有所帮助。祝你好运!
推荐阅读
- javascript - 插入 mariadb 时获取未定义的变量
- wordpress - 我只想显示在 url 上选择了分类的帖子
- python - python中PDF中的额外svg和文本
- physics-engine - 对象在 Matter-js 引擎中下降太快
- json - 授权错误错误400:redirect_uri_mismatch请求中的重定向URI,在.net core3.1中
- docker - 尝试在 docker 上使用 go mod 下载时出错
- database - 安装 sqlite3 和制作 .sqlite 文件有什么区别?
- ms-access - Access 中的查找函数,用于根据文本字符串插入结果
- kubernetes - 跨不同 Kubernetes 集群创建 Zookeeper 集群
- r - R:查找重叠的几何图形:连接路线和道路