前语


在TS进行类型之间的转换和判断的时候经常用到两个东西,分别是inferextends,这篇文章咱们就来讲解下他们的基本运用。

一.extends运用


泛型中,咱们能够运用 extends 关键字来束缚传入的泛型参数必须符合要求。关于 extendsA extends B 意味着 A 是 B 的子类型,这里咱们暂时只需要了解十分简略的判断逻辑,也就是说 A 比 B 的类型更精确,或者说更杂乱。具体来说,能够分为以下几类。

更精确,如字面量类型是对应原始类型的子类型,即 'ddd' extends string599 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 是用于遍历联合类型的运算符。

四.总结


extendsinfer会在类型编程中运用的十分频繁,所以十分的重要,一定要把握运用方法。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。