1. 类型别名
类型别名用来给一个类型起个新名字。
使用 type
创建类型别名。
类型别名常用于联合类型。
type Name = string;
type NameResolver = () => string;
type NameOrResolver = Name | NameResolver;
function getName(n : NameOrResolver): Name {
if (typeof n === 'string') {
return n;
} else {
return n();
}
}
2. 字符串字面量类型
字符串字面量类型用来约束取值只能是某几个字符串中的一个。
类型别名 与 字符串字面量类型 都是使用 type
进行定义的。
type EventNames = 'click' | 'scroll' | 'mousemove';
function handleEvent(ele: Element, event: EventNames){
// ...
}
// 使用 type 定义了一个字符串字面量类型 EventNames,它只能取三种字符串中的一种。
3. 元组
数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象。
注意:在定义时,就应该初始化。当赋值或访问一个已知索引的元素时,会得到正确的类型。
// 定义元组
let tp: [string, number] = ['tuple', 22];
// 赋值
tp[0] = 'sssss';
tp[1] = 25;
// 获取元素
tp[0]
tp[1]
当添加越界的元素时,它的类型会被限制为元组中每个类型的联合类型。就是说添加其他类型的元素会报错。
比如在上面定义的元组中进行以下操作 tp.push(true)
就会报错,因为 tp 的类型只能是 string 或者 number。
4. 枚举
枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。
enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat};
枚举成员会被赋值为从 0
开始递增的数字,同时也会对枚举值到枚举名进行反向映射。
enum Days {
Sun, Mon, Tue, Wed, Thu, Fri, Sat};
// 枚举值到枚举名进行反向映射
console.log(Days['Wed'] === 3); // true
console.log(Days[0] === 'Sun'); // true
4.1 手动赋值
我们可以给枚举项手动赋值,未手动赋值的枚举项会接着上一个枚举项递增。如果未手动赋值的枚举项与手动赋值的重复了,TypeScript是不会察觉到这一点的,后面的项会覆盖前面的项。
手动赋值的枚举项也可以为小数或负数,此后续未手动赋值的项的递增步长仍为 1
,在小数或负数的基础上加 1
;
enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat}; // 未手动赋值的枚举项会接着上一个枚举项递增
4.2 常数项和计算所得项
枚举项有两种类型:常数项(constant member)和计算所得项(computed member)。
// 常数项,默认第一项为0;
// 也可手动赋值第一项,后面的自递增。
enum Color {
Red = 1,
Green,
Blue
};
// 计算所得项
enum Color {
Red,
Green,
Blue = 'blue'.length
};
// 如果紧接在计算所得项后面的是未手动赋值的项,那么它就会因为无法获得初始值而报错。
// 因此计算所得项可以放在后面,否则其后面的项要手动赋值。
// 也就是说上面定义的 Color 枚举中的 Blue 后面还有新的项,其需要重新手动赋值,否则报错
4.3 常数枚举
常数枚举是使用 const enum
定义的枚举类型。
常数枚举与普通枚举的区别:它会在编译阶段被删除,并且不能包含计算成员。若包含计算成员,则会在编译阶段报错。
const enum Directions {
Up,
Down,
Left,
Right
}
let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right];
// 编译结果:
var directions = [0/*Up*/, 1/*Down*/, 2/*Left*/, 3/*Right*/];
4.4 外部枚举
外部枚举(Ambient Enums)是使用 declare enum
定义的枚举类型。
declare
定义的类型只会用于编译时的检查