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

TypeScript中两种对象赋值方式为何报错情况不同?

为什么TypeScript中两种对象赋值方式结果不同?

这其实是TypeScript里**多余属性检查(excess property checking)**在搞鬼,我来给你掰扯清楚:

第一种写法报错的原因

当你直接把对象字面量赋值给带有明确类型的变量时,TypeScript会触发专门针对对象字面量的多余属性检查——这是TypeScript额外加的一层校验,目的是帮你避免不小心写错属性名,或者误添加了不需要的属性。

比如这段代码:

type Person = { name: string }; 
// Error: Object literal may only specify known properties, and 'age' does not exist in type 'Person'.
const person: Person = { name: 'Sarah', age: 13 };

这里age不属于Person类型定义的属性,所以多余属性检查直接抛出错误,这是TypeScript在帮你“排雷”。

第二种写法不报错的原因

而当你先把对象字面量赋值给一个没有明确类型的变量obj时,TypeScript会自动推断obj的类型为{ name: string; age: number }。之后再把obj赋值给Person类型的person,这个时候触发的是TypeScript的结构类型兼容规则:只要源类型包含目标类型要求的所有属性,就允许赋值,不会检查源类型有没有额外属性。

所以这段代码能正常运行:

type Person = { name: string };
const obj = { name: 'Sarah', age: 13 };
const person: Person = obj;
console.log(person); // { name: 'Sarah', age: 13 }

虽然person的类型是Person,但它实际指向的对象还是带有age属性的obj,所以打印出来会包含age——TypeScript的类型检查是编译时的,不会在运行时删除多余属性。

官方解释

TypeScript手册里专门说明了这个行为:

Object literals会被特殊处理,当将其赋值给其他变量或作为参数传递时,会执行excess property checking。如果Object literals包含“目标类型”中没有的属性,就会报错。

简单来说,两种写法看似逻辑一致,但TypeScript对直接使用的对象字面量做了更严格的检查,而对已经被推断类型的变量,只做常规的类型兼容校验。

内容的提问来源于stack exchange,提问作者Dmitry Papka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:17:44