【问题标题】:Type Void[] Array Not Assignable to Type Void类型 Void[] 数组不可分配给类型 Void
【发布时间】: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'。'

我可以解决这两种我知道的方法:

  1. 将 deleteMany 标记为返回 Promise
  2. 到 Promise.all 的 Promise 链,返回一个已解决的 Promise。例如

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

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

【问题讨论】:

  • 为什么不将deleteMany 标记为返回Promise&lt;void[]&gt;?这不是糟糕的支持,这就是 Promise.all 调用返回的结果......
  • 正如@MikeMcCaughan 所建议的那样.. 我同意.. Promise.all 返回一个 Promise 类型的数组,在这种情况下它是无效的
  • 第三个选项:完全关闭返回类型。如果使用不正确,编译器将推断它并引发错误。选择 1 或 3,2 没有意义。
  • 来自 MDN 文档:“如果所有传入的 Promise 都满足,Promise.all 将使用传入的 Promise 中的值数组来满足,其顺序与可迭代的。”这是 Promise.all 的预期结果——一个 Promise 解析为一个包含已完成值的数组,在这种情况下,该数组将全部无效。使用 BUT Promise 输入任何内容会使开发人员感到困惑
  • @MikeMcCaughan 因为消费者不应该关心实现细节。我最喜欢Aluan的建议。 sbking 你说的很对,但是,我发现用 void 类型填充的数组非常无用。

标签: typescript


【解决方案1】:

至少对我来说,1(将 deleteMany 标记为返回 Promise&lt;void[]&gt;)绝对没问题。

但是,如果你真的想返回Promise&lt;void&gt;,你可以使用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】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 1970-01-01
      • 2021-09-23
      • 2020-04-26
      • 2019-05-12
      • 2017-12-29
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多