You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:45:02