likes
comments
collection
share

TS 完全指南之泛型编程(五)

作者站长头像
站长
· 阅读数 65

函数的本质个人认为是

  • 推后部分待定的代码

想象一下 JS 没有函数会怎么样,其实 TS 的泛型就类似于 JS 函数,不过它是推后执行部分待定的类型

泛型实现类型参数化

  • 定义函数的时候不决定参数的类型
  • 而是让调用者使用尖括号形式传入对应函数

比如我们实现一个函数,传入一个参数并返回它,保证这个参数和返回值类型一致

TS 完全指南之泛型编程(五)

此函数我们使用的话

  1. 通过 <类型> 的方式将类型传递给函数;
  2. 通过类型推导,自动推导出传入参数的类型
TS 完全指南之泛型编程(五)

当然我们可以传入多个类型

TS 完全指南之泛型编程(五)

其中,T,E 这些都是我们可以自定义的,它们代表的意义是

  • T(Type):类型
  • K(key)、V(value):,键值对
  • E(Element):元素
  • O(Object):对象
TS 完全指南之泛型编程(五)

泛型接口

泛型接口是一种具有泛型类型参数的接口,它可以在接口的定义中使用这些类型参数,从而使得接口的属性和方法能够适用于多种类型

  • 定义接口的时候使用泛型
TS 完全指南之泛型编程(五)
  • 指定类型默认值
TS 完全指南之泛型编程(五)

泛型类

  • 泛型类是一种具有泛型类型参数的类,它可以在类的定义中使用这些类型参数,从而使得类的属性和方法能够适用于多种类型
TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五)

泛型约束(Generic Constraints)

泛型中使用 extends

TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五)

泛型中使用 keyof

TS 完全指南之泛型编程(五)

泛型中使用 extends 和 keyof

TS 完全指南之泛型编程(五)

映射类型(Mapped Types)

  • 映射类型是 TS 中的一种高级类型,它可以用来从一个现有类型中生成一个新的类型
  • TS 大部分的内置工具和类型体操都是基于映射类型实现
  • 映射类型的语法形式是 { [K in keyof T]: U }
  • 其中 KT 的所有属性名的联合类型,keyof 是一个索引类型查询操作符,用来获取一个类型的所有属性名的联合类型。
  • U 是一个类型变换函数,它用来将 T 中的每个属性类型变成另一个类型
TS 完全指南之泛型编程(五)

在使用映射类型时,有两个额外的修饰符

  • readonly,用于设置属性只读
  • ? ,用于设置属性可选

-? 去掉可选,如果变成 +? 则都变可选 -readonly 代表去除 readonly

TS 完全指南之泛型编程(五)

更高级的一些用法

TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五)

内置工具和类型体操

  • TS 的类型系统增加了很多功能以适配 JS 的灵活性,导致 TS 是一门支持类型编程的类型系统
  • 通常我们为代码加上类型约束,不太需要过多类型编程的能力
  • 但是在开发一些通用框架,库的时候,考虑各种适配就需要更多考虑类型编程

github.com/type-challe…

条件类型(Conditional Types)

  • 条件类型可以根据某个特定的条件,从两个类型中选择一个作为最终类型
  • 写法类似于 JS 三元 :SomeType extends OtherType ? TrueType : FalseType
TS 完全指南之泛型编程(五)

条件类型中推断(infer)和 ReturnType

  • 条件类型提供了 infer 关键词,可以从正在比较的类型中推断类型,然后在 true 分支里引用该推断结果
  • 比如目前有一个数组类型,想要获取函数参数和返回值类型
TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五) TS 完全指南之泛型编程(五)

分发条件类型(Distributive Conditional Types)

  • 泛型中使用条件类型,如果传入联合类型,就会变成 分发的(distributive
TS 完全指南之泛型编程(五)

如果我们希望是 (string | number)[] 这种类型,给 T 加个方括号就行

TS 完全指南之泛型编程(五)

注意:若传入 never ,则返回的类型始终为 never


下面我们自己实现下 TS 中内置类型

Partial

  • 所有属性变为可选的类型
TS 完全指南之泛型编程(五)

Required

  • 所有属性变为必填的类型
TS 完全指南之泛型编程(五)

Readonly

  • 所有属性变为只读的类型
TS 完全指南之泛型编程(五)

Record<Keys, Type>

  • 构造一个对象类型,所有key(键)都是 keys 类型, 所有 value(值)都是 Type 类型
TS 完全指南之泛型编程(五)

Pick<Type, Keys>

  • 构造一个类型,从 Type 类型里面挑选一些类型 Keys
TS 完全指南之泛型编程(五)

Omit<Type, Keys>

  • 构造一个类型,从 Type 类型里面过滤掉一些类型 Keys
TS 完全指南之泛型编程(五)

Exclude<UnionType, ExcludeMembers>

  • 构造一个类型,它是从 UnionType 联合类型里面排除了所有可以赋给 ExcludedMembers 的类型
  • 可以使用它帮助实现 Omit
TS 完全指南之泛型编程(五)

Extract<Type, Union>

  • 构造一个类型,从 Type 类型里面提取了所有可以赋给 Union 的类型
TS 完全指南之泛型编程(五)

NonNullable

  • 构造一个类型,这个类型从 Type 中排除了所有的 null、undefined 的类型
TS 完全指南之泛型编程(五)

InstanceType

  • 构造一个由所有 Type 的构造函数的实例类型组成的类型
TS 完全指南之泛型编程(五)

下面通过泛型结合工厂函数,更灵活获取实例的类型

TS 完全指南之泛型编程(五)
转载自:https://juejin.cn/post/7212622837063385125
评论
请登录