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

TypeScript返回Promise的函数为何不触发对象字面量多余属性校验

结论

这是TypeScript的预期设计行为,并非你遗漏了配置项。

原因解释

TypeScript的对象字面量多余属性校验规则仅在「对象字面量直接赋值给明确标注了目标类型的变量/直接作为返回值匹配目标类型」的场景下触发:

  • 你第一个示例中,函数返回值类型明确标注为IReturnVal,return后直接跟对象字面量,完全匹配触发校验的场景,所以多余属性c会报错。
  • 你第三个返回Promise的示例中,对象字面量是作为Promise.resolve()的入参传入,TypeScript会先根据入参推导出Promise.resolve返回的类型为Promise<{a: boolean, b: boolean, c: number}>,而这个类型和你标注的Promise<IReturnVal>是结构兼容的(所有IReturnVal要求的属性都存在且类型匹配),所以TS会认为赋值合法,不会触发多余属性校验。
  • 缺失属性会报错的原因是:推导出来的Promise泛型如果缺少IReturnVal要求的属性,结构不兼容,自然会抛出类型错误。

解决方案

如果希望返回Promise的场景也能触发多余属性校验,可以用以下任意一种方式:

方式1:给Promise.resolve显式指定泛型参数

function ok(): Promise<IReturnVal> {
    // 此处会触发多余属性报错
    return Promise.resolve<IReturnVal>({
        a: true,
        b: false,
        c: 1,
    });
}

方式2:提前声明返回对象的类型

function ok(): Promise<IReturnVal> {
    // 此处会触发多余属性报错
    const res: IReturnVal = {
        a: true,
        b: false,
        c: 1,
    };
    return Promise.resolve(res);
}

方式3:改用async函数定义

async函数直接return对象字面量时,会触发多余属性校验:

async function ok(): Promise<IReturnVal> {
    // 此处会触发多余属性报错
    return {
        a: true,
        b: false,
        c: 1,
    };
}

内容的提问来源于stack exchange,提问作者Timothy Lee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 23:54:05