【问题标题】:How to handle branching Promises in TypeScript?如何处理 TypeScript 中的分支 Promise?
【发布时间】:2020-02-01 19:44:53
【问题描述】:

我正在尝试在 TypeScript 中输入以下承诺:

const getUserById = (id: number) => new Promise((resolve, reject) => id === 1
    ? resolve({ id, displayName: 'Jan' })
    : reject('User not found.')
);

TypeScript 将其推断为

const getUserById: (id: number) => Promise<Unknown>

我有一个用户界面:

interface User {
  id: number;
  displayName: string;
}

有没有办法让函数getUserbyId 识别它可以用User 解析或用string 拒绝?

【问题讨论】:

    标签: typescript es6-promise typescript-typings


    【解决方案1】:

    如果 Typescript 无法推断它,你可以给箭头函数一个明确的返回类型。如果你给它的类型与实际发生的不匹配,Typescript 会告诉你,所以你不必担心铸造问题。

    const getUserById = (id: number): Promise<User> => new Promise((resolve, reject) => id === 1
        ? resolve({ id, displayName: 'Jan' })
        : reject('User not found.')
    );
    

    【讨论】:

    • 嗨,本,非常感谢!但是 TypeScript 现在不认为它可以用字符串或User 解析吗?而实际上,它只能用User 解析并用字符串拒绝?
    • 嗨,本,再次感谢您。那么TypeScript有没有办法知道这个函数会拒绝一个字符串?
    • 正确,拒绝类型是hard codedany。不过,如果这很重要,您可以在 catch 块中测试类型。
    • 略短const getUserById = (id: number) =&gt; new Promise&lt;User&gt;((resolve, reject) ...
    【解决方案2】:

    要深入了解,可以看一下 Promise 构造函数的类型定义:

    declare type PromiseConstructorLike = new &lt;T&gt;(executor: (resolve: (value?: T | PromiseLike&lt;T&gt;) =&gt; void, reject: (reason?: any) =&gt; void) =&gt; void) =&gt; PromiseLike&lt;T&gt;;

    如你所见,它只需要一个泛型类型T,它指的是resolve值类型,它与reject类型无关(总是any)。

    这就是为什么它无法推断解析类型为User | string

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-26
      • 2017-07-26
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      相关资源
      最近更新 更多