
[英]Type '() => void' is not assignable to type '() => {}'
[英]Type Void[] Array Not Assignable to Type Void
我希望type 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 <void []>'不能分配给'Promise <void>'。 类型'void []'不能分配给'void'类型。'
我可以用以下两种方式解决这个问题:
承诺链到Promise.all,返回已解决的承诺。 例如
return Promise.all(list.map((x) => x.delete())).then(() => Promise.resolve());
第二个更糟糕,因为那段代码在JavaScript中执行,但第一个代码让开发人员感到困惑。 Typescript对Promise.all的支持是否很差,还是在文档中省略了? 有谁找到更好的解决方案?
1(将deleteMany标记为返回Promise<void[]>
)至少对我来说绝对没问题。
但是,如果您真的想要返回Promise<void>
,则可以使用async
/ await
:
class Foo {
delete(): Promise<void> {
// do delete
return Promise.resolve();
}
async deleteMany(list: Foo[]): Promise<void> {
await Promise.all(list.map((x) => x.delete()));
}
该功能的行为方式完全相同。
void
与 null
和设计undefined
的任何其他类型不兼容 ,因此它与void[]
不兼容。
您可以使用Promise<{}>
作为deleteMany
结果类型,即promise解析为空对象。 它起作用,因为空对象类型没有属性(所以它不能以任何方式有意义地使用),并且,因为它没有属性(再次),它几乎可以分配任何东西,包括void[]
:
class Foo {
delete(): Promise<void> {
// do delete
return Promise.resolve();
}
deleteMany(list: Foo[]): Promise<{}> {
return Promise.all(list.map((x) => x.delete()));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.