前语
在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
会在类型编程中运用的十分频繁,所以十分的重要,一定要把握运用方法。