TypeScript声明时赋值与后续赋值的类型校验差异疑问
TypeScript两种赋值行为差异的核心原因
这一差异来自TypeScript两套不同的类型校验规则:普通结构兼容性检查、对象字面量专属的多余属性检查(新鲜度检查)。
- 首先解释
a = b校验通过的逻辑
TypeScript本身是结构类型系统,只要类型B包含类型A的所有必需属性,就判定B是A的子类型,允许子类型变量赋值给父类型变量。你的代码里type B明确包含a: string属性,完全满足A的类型要求,所以B类型的变量b赋值给A类型的变量a是完全合法的,只会做基础的结构匹配检查,不会校验多余的b属性。 - 再解释
let c:A = {a: "A", b: "B"}报错的逻辑
这是TypeScript针对直接赋值的对象字面量额外加的严格校验规则:当你直接把一个未被其他变量引用的对象字面量赋值给指定类型的变量时,会触发多余属性检查,不允许出现目标类型中未定义的属性。这个规则的设计目的是避免开发者手误多写属性、或者写错属性名,减少潜在bug。
如果你确实需要给A类型变量赋值带多余属性的对象字面量,可以用类型断言绕开这个检查:
let c:A = {a: "A", b: "B"} as A; // 不会报错
内容的提问来源于stack exchange,提问作者DJ P
相关产品推荐
相关产品推荐

