【发布时间】:2017-09-21 16:34:33
【问题描述】:
我希望 void[] 类型与 void 类型兼容。具体来说,在使用 Promise.all 时。
class Foo {
delete(): Promise<void> {
// do delete
return Promise.resolve();
}
deleteMany(list: Foo[]): Promise<void> {
return Promise.all(list.map((x) => x.delete()));
}
打字错误:
'Type 'Promise
' 不可分配给 type 'Promise '。类型 'void[]' 不能分配给类型 'void'。'
我可以解决这两种我知道的方法:
- 将 deleteMany 标记为返回 Promise
。 -
到 Promise.all 的 Promise 链,返回一个已解决的 Promise。例如
return Promise.all(list.map((x) => x.delete())).then(() => Promise.resolve());
第二个更糟糕,因为那段代码在 JavaScript 中执行,但第一个让开发人员感到困惑。 Typescript 对 Promise.all 的支持很差,还是从他们的文档中省略了?有人找到更好的解决方案吗?
【问题讨论】:
-
为什么不将
deleteMany标记为返回Promise<void[]>?这不是糟糕的支持,这就是Promise.all调用返回的结果...... -
正如@MikeMcCaughan 所建议的那样.. 我同意.. Promise.all 返回一个 Promise 类型的数组,在这种情况下它是无效的
-
第三个选项:完全关闭返回类型。如果使用不正确,编译器将推断它并引发错误。选择 1 或 3,2 没有意义。
-
来自 MDN 文档:“如果所有传入的 Promise 都满足,Promise.all 将使用传入的 Promise 中的值数组来满足,其顺序与可迭代的。”这是 Promise.all 的预期结果——一个 Promise 解析为一个包含已完成值的数组,在这种情况下,该数组将全部无效。使用 BUT Promise
输入任何内容会使开发人员感到困惑 -
@MikeMcCaughan 因为消费者不应该关心实现细节。我最喜欢Aluan的建议。 sbking 你说的很对,但是,我发现用 void 类型填充的数组非常无用。
标签: typescript