类型Void []数组不可分配给类型Void

时间:2017-04-24 20:51:20

标签: typescript

我希望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()));
  }

打字稿错误:

  

&#39;输入&#39;承诺&lt; void []&gt;&#39;不能分配给&#39; Promise&lt; void&gt;&#39;。键入&#39; void []&#39;不能指定为&#39; void&#39;。&#39;

我可以用以下两种方式解决这个问题:

  1. 将deleteMany标记为返回Promise&lt; void []&gt;。
  2. 承诺连接到Promise.all,返回已解决的承诺。 e.g。

    return Promise.all(list.map((x) => x.delete())).then(() => Promise.resolve());
    
  3. 第二个更糟糕,因为那段代码在JavaScript中执行,但第一个代码让开发人员感到困惑。 Typescript对Promise.all的支持是否很差,还是在文档中省略了?有人找到更好的解决方案吗?

2 个答案:

答案 0 :(得分:5)

1(将deleteMany标记为返回Promise<void[]>)至少对我来说绝对没问题。

但是,如果您真的想要返回async,可以使用await / Promise<void>

class Foo {
  delete(): Promise<void> {
    // do delete
    return Promise.resolve();
  }
  async deleteMany(list: Foo[]): Promise<void> {
    await Promise.all(list.map((x) => x.delete()));
  }

该功能的行为方式完全相同。

答案 1 :(得分:2)

void设计为incompatible with any other type except nullundefined,因此与void[]不兼容。

您可以使用Promise<{}>作为deleteMany的结果类型,即承诺解析为空对象。它起作用,因为空对象类型没有属性(所以它不能以任何方式有意义地使用),并且,因为它没有属性(再次),它几乎可以分配任何东西,包括void[]

class Foo {
    delete(): Promise<void> {
        // do delete
        return Promise.resolve();
    }
    deleteMany(list: Foo[]): Promise<{}> {
        return Promise.all(list.map((x) => x.delete()));
    }
}