源墨
V1
2023/05/04阅读:21主题:萌绿
Typescript学习(第三弹)
泛型
定义
不预先确定的数据类型,具体的类型在使用的时候才确定,把泛型理解为代表类型的参数
泛型函数


泛型函数类型

泛型接口
引用泛型接口要指定一个类型,否则会报错 或者在泛型接口里指定一个默认类型
泛型类
-
泛型放在类的后面这样可以约束类的成员
-
泛型不能应用于类的静态成员
-
实例化泛型类
-
实例化的时候可以显式的传入T的类型,那这个实例化再调用方法就会受到泛型的约束
-
实例化的时候也可以不传入类型,这样实例化再调用的方法就可以传任意值
-
泛型约束
如果你顶一个一个函数函数,要直接调用一个length属性是会报错的
这个时候可以定义一个Length的类型接口,让T继承Length接口,这样T就受到了约束,T就一定会有Length的属性 这个时候函数输入的参数也必须有length属性
泛型的好处
-
函数和类可以轻松的支持多种类型,增强程序的扩展性 -
不必写多条函数重载,冗长的联合类型声明,增强代码可读性 -
灵活控制类型之间的约束
类型检查机制
-
定义:Typescript 编译器在做类型检查时,所秉承的一些原则,以及表现出的一些行为。 -
作用:辅助开发,提高开发效率
类型推断
-
不需要指定变量的类型(函数的返回值类型),Typescript可以根据某些规则自动的为其推断出一个类型
基础类型推断
-
初始化变量 -
设置函数默认参数 -
确定函数返回值
最佳通用类型推断
-
推断出一个可以兼容当前所有类型的通用类型
上下文类型推断
-
根据事件绑定推断出事件类型
类型断言
-
定义:用自己声明的类型覆盖类型推断 可以自己定义一个接口,用as添加断言
类型兼容性
定义
-
当一个类型Y可以被赋值给另一个类型X的时候,我们就可以说类型X兼容Y
-
X兼容Y:X(目标类型) = Y(源类型)
接口兼容性:
-
成员少的兼容成员多的(鸭式辩型法)
函数兼容性
-
参数个数:目标函数多于源函数
-
可选参数和剩余参数
-
固定参数可以兼容可选参数和剩余参数; -
可选参数不兼容固定参数和剩余参数(严格模式下,也可以在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的基础分成了三篇,可以查看相关文章合集来巩固一下,再结合费曼学习法,加强记忆哦~
关注我不迷路

作者介绍
源墨
V1