前语
在TS进行类型之间的转换和判断的时候经常用到两个东西,分别是infer和extends,这篇文章咱们就来讲解下他们的基本运用。
一.extends运用
在泛型中,咱们能够运用 extends 关键字来束缚传入的泛型参数必须符合要求。关于 extends,A extends B 意味着 A 是 B 的子类型,这里咱们暂时只需要了解十分简略的判断逻辑,也就是说 A 比 B 的类型更精确,或者说更杂乱。具体来说,能够分为以下几类。
更精确,如字面量类型是对应原始类型的子类型,即 'ddd' extends string,599 extends number 建立。类似的,联合类型子集均为联合类型的子类型,即 1、 1 | 2 是 1 | 2 | 3 | 4 的子类型。
更杂乱,如 { name: string } 是 {} 的子类型,由于在 {} 的基础上增加了额外的类型,基类与派生类(父类与子类)同理。
二.infer运用
假定咱们有一个类型 Person,包括一个 name 特点和一个 age 特点:
type Person = {
name: string;
age: number;
};
现在,咱们想要从 Person 类型中提取出 name 特点的类型。这时,咱们能够运用 infer 关键字来完成:
type ExtractName<T> = T extends { name: infer Name } ? Name : never;
在上述代码中,咱们定义了一个条件类型 ExtractName,它承受一个类型 T 作为参数。在条件类型中,咱们运用 T extends { name: infer Name } 来检查 T 是否具有 name 特点,并将该特点的类型揣度为 Name。
现在,咱们能够运用 ExtractName<Person> 来提取 Person 类型中的 name 特点的类型:
type NameType = ExtractName<Person>; // 揣度 NameType 的类型为 string
在这个例子中,NameType 被揣度为 string,由于 Person 类型的 name 特点的类型是 string。
三.映射类型
目标、class 在 TypeScript 对应的类型是索引类型(Index Type),那么如何对索引类型作修正呢?
答案是映射类型。
typescript
仿制代码
type MapType<T> = {
[Key in keyof T]?: T[Key]
}
keyof T 是查询索引类型中所有的索引,叫做索引查询。
T[Key] 是取索引类型某个索引的值,叫做索引拜访。
in 是用于遍历联合类型的运算符。
四.总结
extends和infer会在类型编程中运用的十分频繁,所以十分的重要,一定要把握运用方法。
