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

为什么TypeScript函数返回类型不会校验对象的多余属性?

TypeScript 函数返回值多余属性不触发类型错误的原因

你遇到的校验差异是TypeScript的过剩属性检查(Excess Property Checking)的触发规则导致的,属于设计行为而非bug:

  • 当对象字面量直接赋值给明确声明了类型的变量时,TS会触发严格的过剩属性检查,不允许出现目标类型未定义的属性,因此测试1中多余的gg字段会抛出类型错误。
  • 当对象字面量作为函数返回值返回时,不属于「对象字面量直接赋值给目标类型变量」的场景,过剩属性检查不会生效。TypeScript采用结构化类型系统,默认只要返回值包含目标类型要求的所有属性、且属性类型匹配,就算携带多余属性也会被判定为类型兼容,因此测试2不会触发错误。

过剩属性检查本质是TypeScript为了避免开发者手动写对象字面量时写错属性名的便利性校验,不是类型兼容性的强制规则。如果需要让函数返回值也触发过剩属性校验,可以显式给函数返回值标注类型,修改后的代码如下:

type TObj<K extends string> = {
    [key in K]: string;
};

type TestTObj = TObj<'g1' | 'g2'>
type fn<T> = () => T

// 显式标注函数返回值类型后,会触发过剩属性检查
const test_fn: fn<TestTObj> = () : TestTObj => (
    {
        g1: 'g 1',
        g2: 'g 2',
        gg: 'error' // 此处会正确抛出类型错误
    })

内容的提问来源于stack exchange,提问作者Deniss Muhļa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:18:03