首页 文章

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

提问于
浏览
5

我希望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'类型 . '

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

  • 将deleteMany标记为返回Promise <void []> .

  • 承诺链到Promise.all,返回已解决的承诺 . 例如

return Promise.all(list.map((x) => x.delete())).then(() => Promise.resolve());

第二个更糟糕,因为那段代码在JavaScript中执行,但第一个代码让开发人员感到困惑 . Typescript对Promise.all的支持是否很差,还是在文档中省略了?有谁找到更好的解决方案?

2 回答

  • 5

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

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

  • 2

    voidincompatible with any other type except nullundefined 设计,因此它与 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()));
        }
    }
    

相关问题