如何处理 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
的原因。
我正在尝试在 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
的原因。