typescript
一些高级的类型与技术1python
类型别名用来给一个类型起个新名字。typescript
type Name = string; type NameResolver = () => string; type NameOrResolver = Name | NameResolver; function getName(n: NameOrResolver): Name { if (typeof n === 'string') { return n; } else { return n(); } }
字符串字面量类型用来约束取值只能是某几个字符串中的一个c#
//type 定了一个字符串字面量类型 EventNames type EventNames = 'click' | 'scroll' | 'mousemove'; function handleEvent(ele: Element, event: EventNames) { // do something } handleEvent(document.getElementById('hello'), 'scroll'); // 没问题 handleEvent(document.getElementById('world'), 'dbclick'); // 报错,event 不能为 'dbclick'
数组合并了相同类型的对象,而元组(Tuple)合并了不一样类型的对象。想起了python
的元组数组
let xcatliu: [string, number] = ['Xcat Liu', 25]; let xcatliu: [string, number]; xcatliu[0] = 'Xcat Liu'; xcatliu[1] = 25; xcatliu[0].slice(1); xcatliu[1].toFixed(2); // 也能够只赋值其中一项: // 添加越界的元素时,它的类型会被限制为元组中每一个类型的联合类型
枚举(Enum)类型用于取值被限定在必定范围内的场景,好比一周只能有七天,颜色限定为红绿蓝等。概念来于c#
函数
// 枚举使用 enum 关键字来定义: enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; //枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射: console.log(Days["Sun"] === 0); // true console.log(Days["Mon"] === 1); // true console.log(Days[1] === "Mon"); // true console.log(Days[0] === "Sun"); // true //能够给枚举项手动赋值: enum Days {Sun = 7, Mon = 1, Tue, Wed, Thu, Fri, Sat}; //未手动赋值的枚举项与手动赋值的重复了,TypeScript 是不会察觉到这一点的 //使用的时候须要注意,最好不要出现这种覆盖的状况。 //手动赋值的枚举项能够不是数字,此时须要使用类型断言来让tsc无视类型检查 enum Days {Sun = 7, Mon, Tue, Wed, Thu, Fri, Sat = <any>"S"}; //手动赋值的枚举项也能够为小数或负数,此时后续未手动赋值的项的递增步长仍为 1: enum Days {Sun = 7, Mon = 1.5, Tue, Wed, Thu, Fri, Sat};
//计算所得项 "blue".length enum Color {Red, Green, Blue = "blue".length}; //若是紧接在计算所得项后面的是未手动赋值的项,那么它就会由于没法得到初始值而报错: enum Color {Red = "red".length, Green, Blue};//err
当知足如下条件时,枚举成员被看成是常数:code
枚举成员使用常数枚举表达式初始化。常数枚举表达式是 TypeScript 表达式的子集,它能够在编译阶段求值。当一个表达式知足下面条件之一时,它就是一个常数枚举表达式:对象
+, -, ~
一元运算符应用于常数枚举表达式+, -, *, /, %, <<, >>, >>>, &, |, ^
二元运算符,常数枚举表达式作为其一个操做对象。若常数枚举表达式求值后为NaN
或Infinity
,则会在编译阶段报错全部其它状况的枚举成员被看成是须要计算得出的值。ip
const enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //常数枚举与普通枚举的区别是,它会在编译阶段被删除,而且不能包含计算成员。
//外部枚举(Ambient Enums)是使用 declare enum 定义的枚举类型 declare enum Directions { Up, Down, Left, Right } let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]; //declare const 能够同时出现 declare 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 */];