参考链接:
新增基础类型
- 任意类型any:可以赋予任意类型的值。
- 元组类型Tuple:元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。
- 枚举类型enum:定义数值集合。包括数字枚举和字符串枚举。(存在映射关系)
数字枚举默认从0开始,也可以修改默认情况
字符串枚举:字符串的枚举不会自增,枚举的每个成员都必须要有初始值
- void:用于标识方法返回值的类型,表示该方法没有返回值。
- never:never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。即声明为 never 类型的变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)
类型断言
类型断言可以用来手动指定一个值的类型,即允许变量从一种类型更改为另一种类型。
- 尖括号
- as语法
非空断言
在上下文中当类型检查器无法断定类型时,一个新的后缀表达式操作符 !
可以用于断言操作对象是非 null 和非 undefined 类型。具体而言,x! 将从 x 值域中排除 null 和 undefined!
确定赋值断言
在实例属性和变量声明后面放置一个 !
号,从而告诉 TypeScript 该属性会被明确地赋值。
注意:TS总是需要指定值类型,比如变量声明,又比如函数在声明时指定返回值类型,再比如函数参数需要指定类型。
类型注解
就是给变量添加类型约束。
联合类型
可以定一个类型可以是类型1也可以是类型2。用 | 来表示。
上述就表示arr1既可以是number类型也可以是string类型。
交叉类型
通过 &
运算符可以将现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
在上面代码中我们先定义了 PartialPointX
类型,接着使用 &
运算符创建一个新的 Point
类型,表示一个含有 x 和 y 坐标的点,然后定义了一个 Point
类型的变量并初始化。
类型别名
给类型起别名
给复杂类型起别名
类型守卫
类型守卫是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。
in、typeof、instanceof可以检测类型。
当不知道一个数据的类型,并且需要将其作为依赖操作的时候,可 以使用 typeof 操作
in 关键字用来判断之是否属于某个值域中
数组类型
两种定义方式:
其中类型也可以写成联合类型的形式。
可选参数
参数为可选,可选参数使用问号标识 ?
函数重载
重载是方法名字相同,而参数不同,返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
这是因为函数重载是指为同一个函数提供多个函数类型,它的意义在于让你清晰的知道 传入不同的参数得到不同的结果。如果不是这种情况, 那就不需要使用函数重载。(有种catch匹配对应给出对应结果的感觉)
对象类型
单独使用、类型别名与接口可定义
单独使用(const 对象名 :{}):属性就注解方式声明,方法可以是普通函数也可以是箭头函数。函数也需要声明返回值类型,没有返回值则是void
类型别名(type 对象名={})
接口
接口与类型别名区别
- 接口和类型别名都可以用来描述对象的形状或函数签名
- 与接口类型不一样,类型别名可以用于一些其他类型,比如原始类型、联合类型和元组。但是接口只能服务于对象
- 接口和类型别名都能够被扩展,但语法有所不同。此外,接口和类型别名不是互斥的。接口可以扩展类型别名,而反过来是不行的。
- 与类型别名不同,接口可以定义多次,会被自动合并为单个接口。
- 类可以以相同的方式实现接口或类型别名,但类不能实现使用类型别名定义的联合类型
泛型
泛型就是解决 类 接口 方法的复用性、以及对不特定数据类型的支持
泛型函数
因为<number>指定getData函数为Number类型,根据原来的泛型函数可以看出传值应该传Number类型。
泛型类
类中方法min是设置为了泛型,因此我们可以定义是加Number类型还是 String类型。
泛型接口
泛型工具
typeof 用来获取一个变量的类型
keyof 用来获取某种类型的所有键,其返回类型是联合类型。
extends 有时候我们定义的泛型不想过于灵活或者说想继承某些类等,可以通过 extends 关键字添加泛型约束。
Partial 用于定义一个类型,该类型中的所有成员都是可选的。Partial<T>
的作用就是将某个类型里的属性全部变为可选项 ?
Pick 可以配合联合类型从一个类型中取出部分成员,形成一个新的类型
类
注意构造函数的写法以及类的继承中,扩写父方法时需要super调用。