TypeScript联合类型疑问:为何该类型赋值未报错?
TypeScript联合类型赋值疑惑解析
先明确核心规则:TypeScript采用结构子类型判断兼容性,只要对象能满足联合类型中任意一个类型的必填属性要求,且额外属性不与该类型的属性定义冲突,就可以被赋值给这个联合类型。
针对你提到的object4:
const object4: Comb = { age: 3, name: 'pedro' };
这个对象字面量满足Name类型的核心要求——拥有必填的name属性。虽然它多了age属性,但Name类型并没有禁止额外属性的存在(TypeScript对象类型默认是开放的,除非显式用never约束多余属性)。因此这个对象可以被视为Name类型的子类型,自然能赋值给Comb(Person | Name)。
额外补充:
- 你觉得它不满足
Name类型是误解了TypeScript的类型检查逻辑——类型检查只关注目标类型的必填属性是否存在,不会限制额外属性(除非开启exactOptionalPropertyTypes这类额外严格配置,或者使用as const约束字面量)。 - 对比
object3报错,是因为它既不满足Person的必填gender,也不满足Name的必填name,无法匹配联合类型中的任何一个类型。
内容的提问来源于stack exchange,提问作者BraisC
相关产品推荐
相关产品推荐

