1.联合类型
联合类型表示取值可以为多种类型中的一种,使用 |
分隔每个类型。
2.交叉类型
交叉类型真正的用武之地就是将多个接口类型合并成一个类型,从而实现等同接口继承的效果,也就是所谓的合并接口类型,如下代码所示:
在上述示例中,我们通过交叉类型,使得 IntersectionType 同时拥有了 id、name、age 所有属性,这里我们可以试着将合并接口类型理解为求并集。
3.类型别名(创建类型)
- 类型别名(自定义类型)`:类型别名用来给一个类型起个新名字。(类型别名常用于联合类型。)
- 使用场景:当同一类型(复杂)被多次使用时,可以通过类型别名,简化该类型的使用
- 解释:
- 使用
type
关键字来创建自定义类型 - 类型别名(比如,此处的 CustomArray)可以是任意合法的变量名称
- 推荐使用大写字母开头
- 创建类型别名后,直接使用该类型别名作为变量的类型注解即可
- 使用
注意:类型别名,诚如其名,即我们仅仅是给类型取了一个新的名字,并不是创建了一个新的类型。
4.函数类型(返回值和参数类型)
1.单独指定参数、返回值的类型:
2.同时指定参数、返回值的类型:
3.void类型
值得注意的是,方法没有返回值将得到undefined
,但是我们需要定义成void
类型,而不是undefined
类型。否则将报错:
4.never类型(函数异常或者死循环)
- void 用来表示空,以函数为例,就表示没有返回值的函数
- never 类型表示的是那些永不存在的值的类型。
值会永不存在的两种情况:
- 如果一个函数执行时抛出了异常,那么这个函数永远不存在返回值(因为抛出异常会直接中断程序运行,这使得程序运行不到返回值那一步,即具有不可达的终点,也就永不存在返回了);
- 函数中执行无限循环的代码(死循环),使得程序永远无法运行到函数返回值那一步,永不存在返回。
never
类型同null
和undefined
一样,也是任何类型的子类型,也可以赋值给任何类型。
但是没有类型是never
的子类型或可以赋值给never
类型(除了never
本身之外),即使any
也不可以赋值给never
5.可选参数?
可选参数只能出现在参数的最后。
5.元祖类型
元组类型是另一种类型的数组,它确切地知道包含多少个元素,以及特定索引对应的类型(元祖用于保存定长定数据类型的数据)
1.只读的元祖类型
5.枚举类型
6.any
在 TypeScript 中,任何类型都可以被归为 any 类型。这让 any 类型成为了类型系统的顶级类型.
- 原则:不推荐使用 any!这会让 TypeScript 变为 “AnyScript”(失去 TS 类型保护的优势)
- 一个变量设置类型为any后相当于对该变量关闭了TS的类型检测
- 当值的类型为 any 时,可以对该值进行任意操作,并且不会有代码提示
7.unkown
unknown
与any
的最大区别是: 任何类型的值可以赋值给any
,同时any
类型的值也可以赋值给任何类型。unknown
任何类型的值都可以赋值给它,但它只能赋值给unknown
和any
。看看下面这个例子:
8.类型断言
在 TypeScript 看来,greaterThan2 的类型既可能是数字,也可能是 undefined,所以上面的示例中提示了一个 ts(2322) 错误,此时我们不能把类型 undefined 分配给类型 number。
不过,我们可以使用一种笃定的方式——类型断言(类似仅作用在类型层面的强制类型转换)告诉 TypeScript 按照我们的方式做类型检查。
1.非空断言
在上下文中当类型检查器无法断定类型时,一个新的后缀表达式操作符 !
可以用于断言操作对象是非 null 和非 undefined 类型。*具体而言,x! 将从 x 值域中排除 null 和 undefined 。