如何处理 TypeScript 中的分支 Promise?

How to handle branching Promises in TypeScript?

我正在尝试在 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 在推断它时遇到问题,您可以为箭头函数指定一个明确的 return 类型。如果你给它的类型与实际发生的不匹配,Typescript 会告诉你,所以你不会像转换一样担心。

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

为了更深入的理解,你可以看看 Promise 构造函数的类型定义:

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

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

这就是它无法推断解析类型为 User | string 的原因。