泛型
定义
不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数
泛型函数
泛型函数类型
泛型接口
引用泛型接口要指定一个类型,否则会报错
或者在泛型接口里指定一个默认类型
泛型类
-
泛型放在类的后面这样可以约束类的成员
-
泛型不能应用于类的静态成员
-
实例化泛型类
-
实例化的时候可以显式的传入T的类型,那这个实例化再调用方法就会受到泛型的约束
-
实例化的时候也可以不传入类型,这样实例化再调用的方法就可以传任意值
-
泛型约束
如果你顶一个一个函数函数,要直接调用一个length属性是会报错的
这个时候可以定义一个Length的类型接口,让T继承Length接口,这样T就受到了约束,T就一定会有Length的属性
这个时候函数输入的参数也必须有length属性
泛型的好处
- 函数和类可以轻松的支持多种类型,增强程序的扩展性
- 不必写多条函数重载,冗长的联合类型声明,增强代码可读性
- 灵活控制类型之间的约束
类型检查机制
- 定义:Typescript 编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。
- 作用:辅助开发,提高开发效率
类型推断
- 不需要指定变量的类型(函数的返回值类型),Typescript可以根据某些规则自动的为其推断出一个类型
基础类型推断
- 初始化变量
- 设置函数默认参数
- 确定函数返回值
最佳通用类型推断
- 推断出一个可以兼容当前所有类型的通用类型
上下文类型推断
- 根据事件绑定推断出事件类型
类型断言
- 定义:用自己声明的类型覆盖类型推断
可以自己定义一个接口,用as添加断言
类型兼容性
定义
-
当一个类型Y可以被赋值给另一个类型X的时候,我们就可以说类型X兼容Y
-
X兼容Y:X(目标类型) = Y(源类型)
接口兼容性:
- 成员少的兼容成员多的(鸭式辩型法)
函数兼容性
-
参数个数:目标函数多于源函数
-
可选参数和剩余参数
- 固定参数可以兼容可选参数和剩余参数;
- 可选参数不兼容固定参数和剩余参数(严格模式下,也可以在tsconfig里面修改配置);
- 剩余参数兼容固定参数和可选参数
-
参数类型:必须匹配
- 但是参数如果是对象:成员多的会兼容成员少的(严格模式下);相互兼容(非严格模式,可以在tsconfig里面修改配置),也叫函数参数的双向协变
- 但是参数如果是对象:成员多的会兼容成员少的(严格模式下);相互兼容(非严格模式,可以在tsconfig里面修改配置),也叫函数参数的双向协变
-
返回值类型:目标函数必须与原函数相同,或为其子类型
枚举兼容性
- 枚举类型和数字类型互相兼容
- 枚举类型之间不兼容
类的兼容性
- 静态成员和构造函数不在比较范围
- 两个类具有相同的实例成员, 它们的实例相互兼容
- 类中包含私有成员或受保护成员,只有父类和子类的实例相互兼容
泛型兼容性
- 泛型接口:只有类型参数T 被接口成员使用时,才会影响兼容性
- 泛型函数:定义相同,没有指定类型参数时就兼容
记忆口诀:
- 结构之间兼容:成员少的兼容成员多的
- 函数之间兼容:参数多的兼容参数少的
类型保护
- 定义:在特定的区块中保证变量属于某种确定定的类型
创建区块的方法
-
instanceof :用instanceof来判断是否实例
-
typeof
-
in:用in来判断属性是否存在
-
类型保护函数 特殊的返回值:arg is type(类型谓词)
高级类型
交叉类型(类型并集)
- 含义:将多个类型合并为一个类型,新的类型将具有所有类型的特性
- 应用场景:混入
用&连接,取两个接口的并集
联合类型(类型交集)
- 含义:类型并不确定,可能为多个类型中的一个
- 应用场景:多类型支持
- 对象联合类型,取对象方法的交集
- 对象联合类型,取对象方法的交集
- 可区分的联合类型:结合联合类型和字面量类型的类型保护方法
字面量类型
- 字符串字面量
- 数字字面量
- 应用场景:限定变量取值范围
索引类型
要点
- keyof T(索引查询操作符) 类型T公共属性名的字面量联合类型
- TK:对 象T的属性 K所代表的类型
- 泛型约束
应用场景:
- 从一个对象中选取某些属性的值
映射类型
- 含义:从旧类型创建出新类型
应用场景
同态:只作用于T的属性
- Readonly:将T的 所有属性变为只读
- Partial:将T的所有 有属性变为可选
- Pick<T,K>:选取以K光为属性的对象T的子集
- Record<K,T>:创新属性为K的新对象,属性值的类型为T
条件类型
- 含义:T extendsU?X:Y(如果类型T可以赋值给类型 U,那么结果类型就是X,否则就是 Y)
应用场景
- Exclude<T,U>:从T中 过滤掉可以赋值给U的类型
- Extract<T,U>:从T中抽取出可以赋值给U的类型
- NonNullable:从T口中除去 undefined 和 null
- ReturnType:获取函数的返回值类型
// T extends U ? X : Y
type TypeName<T> =
T extends string ? "string" :
T extends number ? "number" :
T extends boolean ? "boolean" :
T extends undefined ? "undefined" :
T extends Function ? "function" :
"object";
type T1 = TypeName<string>
type T2 = TypeName<string[]>
// (A | B) extends U ? X : Y
// (A extends U ? X : Y) | (B extends U ? X : Y)
type T3 = TypeName<string | string[]>
type Diff<T, U> = T extends U ? never : T
type T4 = Diff<"a" | "b" | "c", "a" | "e">
// Diff<"a", "a" | "e"> | Diff<"b", "a" | "e"> | Diff<"c", "a" | "e">
// never | "b" | "c"
// "b" | "c"
type NotNull<T> = Diff<T, null | undefined>
type T5 = NotNull<string | number | undefined | null>
// Exclude<T, U>
// NonNullable<T>
// Extract<T, U>
type T6 = Extract<"a" | "b" | "c", "a" | "e">
// ReturnType<T>
type T8 = ReturnType<() => string>
总结
Typescript的基础分成了三篇,可以查看相关文章合集来巩固一下,再结合费曼学习法,加强记忆哦~