TypeScript判定Promise构造函数内赋值的let变量为undefined如何解决
报错原因
- 你声明
let resolver时未指定类型也没有初始值,TypeScript 默认推导它的类型是undefined | any - TypeScript 无法识别 Promise 构造函数的回调会在
push操作前同步执行,所以在执行数组插入时,编译器认为resolver仍有可能为undefined,和Request接口要求的() => void必填类型不匹配,触发2322错误。
解决方法
因为 Promise 构造函数的执行器回调本身就是同步执行的,实际运行时resolver一定会被赋值,不存在undefined的情况,你可以任选下面一种方案修复类型问题:
方案1:显式声明类型+非空断言
建议优先用这种方案,类型更严谨:
interface Request { ids: string[]; // 这里调整resolver类型适配原生Promise resolve的传参逻辑,避免后续调用resolve传参时报错 resolver: (value?: unknown) => void; promise: Promise<unknown> } class Foo { public requests: Request[] = []; public createPromise = (ids: string[]) => { // 提前给resolver声明正确类型 let resolver: (value?: unknown) => void; const promise = new Promise((r) => { resolver = r; }); // 用非空断言!告知编译器resolver已经被赋值,不会为undefined this.requests.push({ ids, resolver: resolver!, promise }); return promise; }; }
方案2:直接类型断言
如果不想修改原有类型定义,可以在插入时直接强制断言类型:
this.requests.push({ ids, resolver: resolver as () => void, promise });
内容的提问来源于stack exchange,提问作者Alan
相关产品推荐
相关产品推荐

