在JavaScript中,有时可以使用Promise.all
在一系列异步操作中重用一些数据,如下所示:
logMeIn()
.then(token => {
return Promise.all([
token,
fetchProfile(token)
])
})
.then(([token, profile]) => {
return getAvatar(token, {userId: profile.id})
})
// etc...
正如我们所看到的,第二个then
解析器需要第一个解析器的结果,但仍然需要token
。一种方法是将第二个then
调用嵌套在第一个调用内,但这可能会变得很丑陋,而且在长链中它并不比那些旨在减轻调用的回调更好。
使用Promise.all()
允许我们重复使用先前解析器中的数据并将其传递给链。
这一切都很有效但是当你尝试用这样的错误执行此操作时TypeScript会翻转:
类型'(String | Promise< Something>)[]'的参数不可分配 到'IterableShim< Something |类型的参数 PromiseLike<东西>>”。属性类型'“ es6-shim iterator ”' 是不相容的。
输入'()=> IterableIteratorShim< string |无极<东西>>”不能分配给'()=>类型迭代器< Something | PromiseLike<东西>>”
在TypeScript中是否有办法可以完成上述操作,最好是在保持类型安全的情况下?
答案 0 :(得分:0)
您可以尝试明确指定返回类型:
logMeIn()
.then<[Token, Profile]>(token => Promise.all([token, fetchProfile(token)]))
.then(([token, profile]) => getAvatar(token, { userId: profile.id }))