TS的类型系统
基本概念
下面将说明几种基础的TS类型注解
-
基本类型注解
- JS的基本类型可以用作类型注解,如可以声明某个变量的类型是number。
-
数组注解
- 数组注解用于为数组添加类型注解,它一般由 元素类型 + []组成(如,boolean[])。
-
接口注解
- 接口注解用于将多个类型注解合并为一个类型注解,这就允许我们利用接口为对象等规定类型。
-
内联类型注解
- 内联类型注解功能类似于接口注解,可以用于约束对象等的类型。(如果需要为多个对象提供相同的类型,那么还是建议使用接口注解)。
-
特殊类型
-
TS中还存在一些特殊类型
-
any
-
当TS类型检查器遇到any时,会不对定义为any类型的变量进行类型检查。(这表示定义为any类型的变量可以是任何类型的)。
- 定义为any类型的变量可以接受任意类型的数据。
- 定义为any类型的变量可以兼容任意类型的变量。(也就是说任意类型的变量都可以赋值给any类型的变量)。
-
-
null
- null可以赋值给任意类型的变量。
-
undefined
- undefined字面量可以赋值给任意类型的变量。
-
void
- void用于表示一个函数没有返回值。
-
-
-
泛型
- 泛型可以用于函数、类、接口,它一般用于约束多个变量,要求它们具有相同的类型,但是并不指定具体的类型。
-
联合类型
-
当你想要一个变量的类型可能是多种类型之一(如,string或number都可以),这时就可以使用联合类型。
- 联合类型使用 |。
-
-
交叉类型
-
交叉类型是将多个类型合并为一个类型。
- 交叉类型使用 & 。
-
-
元组类型
- 元组类型用于给元组(JS中一般使用数组表示元组,元组可以包含任意数量的成员,元组中的每个元素类型可以不同)添加类型注解。
-
类型别名
-
类型别名用于为一些类型注解创建别名。
- 类型别名使用 type 。
-
深入接口
接口和内联注解的区别
- 内联注解作用类似于接口,用于声明变量的结构,但是内联注解只是一次性的。
使用接口约束类的结构的方法
-
使用implements关键字,可以让一个接口来约束一个类的结构。
-
class myPoint implements Point
- myPoint类的结构将受到接口Point的约束。
-
什么时候使用接口
- 接口一般用于约束对象、函数等引用类型(因为接口是结构化的),同时接口还可以约束类的实现。
深入枚举
我们可以先来看看其他语言中的枚举是做什么的。
-
Java
- 在Java中,枚举是一个特殊的类,一般用于表示一组常量。
-
C语言
-
在C语言中,枚举也是用于表示一组常量,如一个星期7天,用1-7表示,C语言可以使用枚举为每个整数定义一个别名。
- enum 枚举名{
标识符①[=整型常数],
标识符②[=整型常数],
…
标识符N[=整型常数],
}枚举变量;
- enum 枚举名{
-
TS中的枚举
-
数字枚举
-
在TS中,如果定义一个枚举时,没有将字符串类型等的数据赋值给枚举成员,那么就是一个数字枚举。(且枚举成员的值从0开始递增)。
-
如何将一个变量声明为一个写好的数字枚举。
-
假设有数字枚举 Card
- 可以使用let a = Card.Clubs
- 也可以使用 let a: Card.Clubs。
-
-
数字枚举存在双向映射,原理在于从数字枚举编译成的JS代码。
-
-
字符串枚举
-
字符串枚举的作用
- 字符串枚举将会提供有意义且可供调试的字符串。
-
-
常量枚举
-
常量枚举的作用
-
常量枚举一般用于性能提升。
- 当使用枚举成员为变量赋值时,可以使用常量枚举提升性能(原理和编译出的JS代码有关)。
-
-
声明一个常量枚举的方法
- 在enum关键字前面加上const,表示这是一个常量枚举。
-
-
为枚举添加静态方法
-
由于枚举编译成的JS代码中,实际上是一个对象,所以我们也可以为枚举添加静态方法。
- 使用namespace关键字+枚举名称,就可以为指定枚举添加静态方法。
-