使用类型别名实现
type StringOrNumberObj = string | { [key: string]: number };
type ExtendedType = StringOrNumberObj & { [key: string]: string };
使用接口实现
interface NumberObj {
[key: string]: number;
}
interface StringAndNumberObj extends NumberObj {
[key: string]: string;
}
type StringOrNumberObj = string | NumberObj;
选择类型别名或接口的理由
- 类型别名:更灵活,适用于各种类型定义,包括联合类型、交叉类型等复杂情况。在这里定义联合类型很方便。
- 接口:主要用于定义对象类型结构,在面向对象编程中更强调对象的契约。这里使用接口可以更清晰地表达对象的结构继承关系。
联合类型和交叉类型的不同表现
- 联合类型:
- 类型别名:使用
|
符号直接定义,如 string | { [key: string]: number }
,表示该类型的值可以是字符串,也可以是符合指定结构的对象。
- 接口:接口本身不能直接定义联合类型,但可以通过类型别名来间接实现接口的联合,如
type StringOrNumberObj = string | NumberObj;
,这里 NumberObj
是接口。
- 交叉类型:
- 类型别名:使用
&
符号定义,如 StringOrNumberObj & { [key: string]: string }
,表示该类型的值需要同时满足 StringOrNumberObj
和 { [key: string]: string }
的要求。
- 接口:接口通过
extends
关键字实现类似交叉类型的效果,如 interface StringAndNumberObj extends NumberObj { [key: string]: string; }
,StringAndNumberObj
继承了 NumberObj
的属性,同时增加了新的字符串属性要求。