联合类型&交叉类型、泛型、类型保护、类型推断
# 联合类型
- 联合类型表示一个值的类型可能是多个类型中的一种,使用【|】来间隔每个类型
- 一个联合类型只能访问所有类型都有的成员。
interface A1 {
v1: number;
v2: number;
}
interface A2 {
v1: string;
v3: boolean;
}
function a1 (x: A1 | A2): void {
x.m1;
x.m3; // 报错, 只能确保包含A1 | A2的共有成员
}
# 交叉类型
- 交叉类型将多个类型合并为一个类型。交叉类型会包含所有类型的成员, 使用【&】来间隔每个类型
interface A1 {
v1: number;
v2: number;
}
interface A2 {
v1: string;
v3: boolean;
}
function a1 (x: A1 & A2): void {
x拥有v1,v2,v3 A1,A1所有类型的成员
}
# 泛型
- 定义包含可复用类型的类型。
- 显示指定泛型变量的实际类型
- 不指定泛型变量的实际类型
常用变量:
T:(type)表示类型
K:(key)表示对象中键的类型
V:(Value)表示对象中值的类型
E:(Element)表示元素类型
# 类型保护
假设我们确实要访问非共有属性或者方法,可以使用类型断言
// 使用类型断言
(getAnimal() as Fish).swim();
(getAnimal() as Bird).fly();
这会导致我们不得不多次使用类型断言,更好的方式是使用类型保护,执行运行时类型检查来保证类型在一定范围内的表达式
# 类型谓词
谓词为 parameterName is Type 这种形式,parameterName 必须是来自于当前函数签名里的一个参数名
# in运算符
n in x表达式中,n是一个字符串字面量或字符串字面量类型,x是一个联合类型。
# typeof 类型保护
如果联合类型中的类型都是原始类型的话,可以直接使用typeof来判断。typeof v === "typename",typename必需是number、string、boolean、或者symbol。只有通过 ===, !== 比较时,才会被识别为类型保护
# instanceof 类型保护
instanceof的右边需要是一个构造函数,TypeScript会按以下顺序缩小范围:
- 构造函数的prototype属性的类型(如果构造函数的prototype属性的类型不为any)。
- 类型的构造标志返回的类型的并集。
# 类型推断
- 当变量的声明和初始值在同一行,可以省略变量类型的声明
- 类型推断不出来,就需要类型注解协助