TypeScript的初学习(2)
5.函数
函数类型
- 为函数定义类型
let myAdd = function(x: number, y: number): number { return x + y; };
- 书写完整函数类型
let myAdd: (baseValue: number, increment: number) => number = function(x: number, y: number): number { return x + y; }; let my:(x:number,y:number)=>void
- 推断类型:在函数的赋值语句一边指定类型而一边没有,类似上边为函数定义类型,编译器会自动识别类型
可选参数和默认参数
ts中,传递给参数的个数与函数期望的参数个数一致。
可选参数:在没传参时,是默认undfined。可选参数必须放在必选参数的后边。
默认参数:为参数提供一个默认值当用户没有传递这个参数或者参数是undefined时。
顺序:默认参数、必须参数、可选参数
剩余参数
使用...,将剩余的参数全部包含在这个数组里。
this
箭头函数能保存函数创建时的 this
值,而不是调用时的值。
重载
同一个函数提供多个函数类型定义来进行函数重载。
6.泛型
使用泛型定义,可支持多种类型的数据,用户可以根据自己的数据类型来使用组件。
function identity<T>(arg: T): T { return arg; }
- 使用泛型变量
参数是任意或者所有类型
function loggingIdentity<T>(arg: T[]): T[] { console.log(arg.length); // Array has a .length, so no more error return arg; }
- 泛型类型
泛型函数的类型
function identity<T>(arg: T): T { return arg; } let myIdentity: {<T>(arg: T): T} = identity; //类型参数在前边。
泛型的接口
interface GenericIdentityFn<T> { (arg: T): T; } function identity<T>(arg: T): T { return arg; } let myIdentity: GenericIdentityFn<number> = identity;
- 泛型类
class GenericNumber<T> { zeroValue: T; add: (x: T, y: T) => T; } let myGenericNumber = new GenericNumber<number>(); myGenericNumber.zeroValue = 0; myGenericNumber.add = function(x, y) { return x + y; };
泛型类指的是实例部分的类型,所以静态属性不能属于这个类型
- 泛型约束
定义接口来描述约束条件。
在泛型约束中使用类型参数
在泛型约束中使用类类型(类的类型)
7.枚举
- 数字枚举
enum Direction { Up = 1, //不设置默认值,是从0开始 Down, //2 Left, //3 Right //4 }
- 字符串枚举
enum Direction { Up = "UP", Down = "DOWN", Left = "LEFT", Right = "RIGHT", }
异构枚举:混合字符串和数字成员
计算的和常量成员
常量枚举表达式:一般之中包含一元或者二元运算符,带括号的常量,数字字面量或者字符串字面量。
除了常量之外,所有的都被当做是需要计算的成员。
联合枚举与枚举成员的类型
反向映射:
enum Enum { A } let a = Enum.A; let nameOfA = Enum[a]; // "A"
const枚举:
只能使用常量枚举表达式
外部枚举:
用来描述已经存在的枚举类型的形状。
与内部枚举的区别:在正常的枚举里,没有初始化方法的成员被当成常数成员。 对于非常数的外部枚举而言,没有初始化方法时被当做需要经过计算的。
8.类型推论
最佳通用类型:选择最合适的一个通用类型
上下文类型:类型推论也可能按照相反的方向进行,这被叫做“按照上下文分类”。按照上下文归类会发生在表达式的类型与所处的位置相关。