TypeScript:类与接口联合类型疑问——为何可声明未定义属性?
TypeScript类/接口联合类型创建及相关问题解答
一、如何创建类或接口的联合类型
在TypeScript中,用type关键字配合竖线|就能把类、接口、基础类型组合成联合类型,语法简单直接:
// 定义类和接口 class Type1 { value: string | symbol; constructor(value: string | symbol) { this.value = value; } } interface Type2 { name: string; use: boolean; } // 创建联合类型:包含字符串、Type1类实例、Type2接口对象 type Token = string | Type1 | Type2;
联合类型意味着变量的类型可以是|分隔的任意一种类型。
二、为什么Type2接口对象能添加额外的value属性
这是因为TypeScript采用结构类型系统,判断类型兼容性只看结构是否匹配,不看类型名称。
你的代码里,Token是string | Type1 | Type2的联合类型,当你把{name: "token", use: true, value: "value"}赋值给token变量时,TypeScript会检查这个对象是否符合联合类型中至少一个成员的结构要求:
- 这个对象拥有
name和use属性,完全匹配Type2接口的结构,所以它属于Type2类型,能被赋值给Token类型变量。 - 额外的
value属性不会触发错误,因为结构类型系统只要求对象满足目标类型的必要属性,允许存在额外属性(除非用Exact<Type2>这类工具类型强制限制精确结构)。
内容的提问来源于stack exchange,提问作者Meslzy
相关产品推荐
相关产品推荐

