Promise的resolve()和reject()函数的正确TypeScript类型是什么?
Promise构造函数中resolve和reject的正确类型声明方法
你之前用typeof Promise.resolve和typeof Promise.reject声明Map类型的写法是错误的——这两个是Promise的静态方法类型,和Promise构造函数回调里的resolve、reject类型完全不匹配。
问题根源
Promise.resolve作为静态方法,类型是<T>(value?: T | PromiseLike<T>) => Promise<T>,调用后会返回一个新的Promise实例;而Promise构造函数回调里的resolve是(value: T | PromiseLike<T>) => void,它仅用于标记Promise状态为已完成,没有返回值。两者的类型差异直接导致TypeScript报错。
正确的类型声明方案
有两种实用的写法:
1. 手动声明类型
根据Promise构造函数回调的参数定义,直接写出回调对的类型:
// 泛型T对应Promise最终resolve的值类型,可根据业务场景替换成具体类型 type PromiseCallbackPair<T> = [ (value: T | PromiseLike<T>) => void, (reason?: any) => void ]; // 声明Map时指定类型 const reqs: Map<number, PromiseCallbackPair<unknown>> = new Map(); // 使用示例 return new Promise((resolve, reject) => { reqs.set(id, [resolve, reject]); });
2. 用TypeScript内置工具提取类型
借助Parameters工具类型,从Promise构造函数的执行器参数中自动提取resolve和reject的类型:
// 定义Promise执行器的类型 type PromiseExecutor<T> = ( resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void ) => void; // 提取执行器的参数类型作为回调对类型 type PromiseCallbackPair<T> = Parameters<PromiseExecutor<T>>; // 声明Map const reqs: Map<number, PromiseCallbackPair<unknown>> = new Map(); // 使用示例 return new Promise((resolve, reject) => { reqs.set(id, [resolve, reject]); });
如果你的Promise有明确的resolve值类型,把unknown换成对应的类型(比如string、number或自定义接口)即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

