【问题标题】:How to return type Promise<void> or Promise<any>?如何返回类型 Promise<void> 或 Promise<any>?
【发布时间】:2021-08-07 05:45:20
【问题描述】:

在打字稿中 我怎样才能返回任何一种类型的承诺 Promise&lt;void&gt; 要么 Promise&lt;any&gt;

我试过了

  • Promise&lt;void | any&gt;
  • Promise&lt;void&gt; | Promise&lt;any&gt;

产生的错误是Promise&lt;void | any&gt;:

error TS2794: Expected 1 arguments, but got 0. Did you forget to include 'void' in your type argument to 'Promise'?

我在从 Angular 11 -> 12 升级时遇到了这个错误。这个 TypeScript 版本现在在没有提供 Promise 类型时会抛出这个错误。

请参阅下面的示例类型错误...

type SpecialPromise = (number: number) => Promise<void>;

const returnsSomething: SpecialPromise = (number: number) => {
  return new Promise((resolve) => setTimeout(() => resolve(number), 2000));
};
const returnsVoid: SpecialPromise = (number: number) => {
  return new Promise((resolve) => setTimeout(() => resolve(), 2000));
};
Promise.all([
  returnsSomething(Math.random()),
  returnsVoid(Math.random())
]).then((numbers) => console.log(numbers));

问题是当我创建一个新的承诺时,它默认需要一个类型。 void (nothing) 不是类型。

new <T>(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void) => void): Promise<T>;

一个简单的解决方法是在创建 Promise 时指定类型。

new Promise<void>

但如果我决定使用,我仍然会收到错误:

new Promise<void | any>

【问题讨论】:

  • ActionMetadata 是否扩展 ActionTrigger?请发布minimal reproducible example 和完整的错误消息。
  • @Bergi 我将问题更新为一般性并举了一个例子。
  • 该错误消息似乎与调用 resolve 函数有关,而不是类型声明。您能否在您的问题中发布完整的代码?

标签: angular typescript promise


【解决方案1】:

我想你想要 Promise

【讨论】:

    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2021-10-17
    • 2021-03-17
    • 1970-01-01
    • 2018-01-04
    • 2019-07-25
    相关资源
    最近更新 更多