为什么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
相关产品推荐
相关产品推荐

