【问题标题】:Return type of async method异步方法的返回类型
【发布时间】:2019-06-04 05:58:27
【问题描述】:

Typescript 可以用ReturnType<> 给出函数或类方法的返回类型,如:

class Foo{
    bar(){ return {one:1, two:2};}
}

type  typeBar = ReturnType<Foo['bar']>;

但是,如果方法是异步的,是否可以获得已解决的承诺的类型?

class Foo{
    async asyncBar() { return new Promise((resolve) => resolve({ one: 1, two: 2 }));}
}
type  typeBar = ReturnType<Foo['asyncBar']>; // the type here is Promise

那么从Foo['asyncBar'] 得到{one:number, two:number} 的操作员是什么?

【问题讨论】:

  • 类型不应该只是Promise吗?您的意思是获得已解决承诺的预期类型吗?编辑:我猜不是,但不是专家,我正在等待回复
  • @Osakr 是正确的,您定义asyncBar 的方式将是Promise&lt;{}&gt;,这是正确的,因为这是函数的返回。你期望typebar 是什么? Promise&lt;{one:number, two:number}&gt; 或者你只是想要{one:number, two:number}。我们可以得到任何一个,但您需要提供更多信息:)
  • @TitianCernicova-Dragomir,是的,我想要 {one:number, two:number},已解决承诺的类型
  • 你可以用type Unpack&lt;T&gt; = T extends Promise&lt;infer U&gt; ? U : never解压一个promise类型
  • @IngoBürk 这听起来像是对我的回答(或接近一个),为什么要把它放在应该的地方:)

标签: typescript asynchronous return-type


【解决方案1】:

你可以定义一个类型

type Unpack<T> = T extends Promise<infer U> ? U : T;

然后使用

class Foo {
    async asyncBar() { return new Promise<{one:1, two:2}>((resolve) => resolve({ one: 1, two: 2 }));}
}

type Unpack<T> = T extends Promise<infer U> ? U : T;
type typeBar = Unpack<ReturnType<Foo["asyncBar"]>>;

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多