为何TypeScript允许含属性的Person类型赋值给空对象类型{}?
TypeScript中{}类型的赋值逻辑解析
先看你给出的代码:
interface Person { name: string }; let person : Person = { name: "John Smith" }; let empt: {} = person;
你对{}类型的理解有误——它不是“完全没有属性的空对象类型”,而是代表一个只要是对象(非原始类型)就符合要求的类型。
TypeScript采用结构子类型系统,核心逻辑是:如果A类型的结构能满足B类型的所有要求,A就能赋值给B。{}类型的要求极低,只要是对象(不是string、number、boolean这类原始值)就行,对象上有没有额外属性根本不影响赋值的合法性。
Person类型的实例是标准对象,完全满足{}类型的最低要求,所以这种赋值是被允许的。
你可以试试访问empt.name,TypeScript会报错,因为{}类型并没有声明name属性,但这和赋值逻辑不冲突——赋值只看源类型是否满足目标类型的基础要求,不限制它拥有额外属性。
内容的提问来源于stack exchange,提问作者lch
相关产品推荐
相关产品推荐

