TypeScript 对象展开赋值未检出不匹配类型额外属性问题
TypeScript对象展开赋值未校验额外类型属性问题
我在使用TypeScript时遇到如下问题:属于某一类型的对象通过展开赋值注入到另一完全不同类型的对象中时,TypeScript不会抛出任何错误提示。
以下是复现代码:
interface Pizza { cookingTime: number; size: "Small" | "Medium" | "Large"; } interface Car { modelName: string; yearManufactured: number; } const produceMalformedPizza = (car: Car): Pizza => { return { ...car, // 此处注入了Car类型的属性,但没有触发类型错误 cookingTime: 10, size: "Small", } } console.log( produceMalformedPizza({ modelName: "NotAPizza", yearManufactured: 1980 }) ) /* 输出结果: [LOG]: { "modelName": "NotAPizza", "yearManufactured": 1980, "cookingTime": 10, "size": "Small" } */
我已经开启了所有可配置的严格校验规则,直接复制上述代码即可复现问题。
如果我在produceMalformedPizza函数中直接返回未定义的非法属性,编译器会按预期抛出错误,但通过对象展开赋值似乎可以注入任意额外属性数据。
我接触TypeScript时间不长,想请教这是否是预期行为?是不是使用对象展开解构无法获得对应的类型安全推导保障?
补充说明
根据@T.J.Crowder的答复,该行为是TypeScript的有意设计,相关说明可参考TypeScript官方GitHub仓库的Issues记录:
- 对应问题讨论的Issue编号为43499
- 支持Exact精确类型校验的提案对应Issue编号为12936
内容的提问来源于stack exchange,提问作者Sarreph
相关产品推荐
相关产品推荐

