TypeScript的一些小用法

王大拿  |  2018. 12. 19   |  阅读 1315 次
typescript

预先定义的条件类型(Predefined conditional types)

TS提供了几种内置的预定义的条件类型

  • Exclude - 用于从类型T中去除不在U类型中的成员
  • Extract - 用于从类型T中取出可分配给U类型的成员
  • NonNullable - 用于从类型T中去除undefined和null类型
  • ReturnType - 获取函数类型的返回类型
  • InstanceType - 获取构造函数的实例类型

下面分别来举例:

1.Exclude

Exclude<T, U>

在这个例子中,因为用到了Exclude这个条件类型,会尝试寻找在T类型中有,但在U类型中没有的成员,最后将获取到的Union类型"b" | "d"赋给T00

2.Extract

Extract<T, U>

Extract首先是取出的意思,应用Extract条件类型,会尝试寻找T类型成员和U类型成员的交集,在该示例中,取到的是"a" | "c"

3.NonNullable

NonNullable<T>

通过运行NonNullable,清除了undefined类型成员

4.ReturnType

ReturnType<T> ReturnType<T>

通过ReturnType,返回了范型参数T的返回值类型

5.InstanceType

InstanceType<T>

Omit

目前的ts版本(3.2及以前)并没有内置Omit,那么Omit是什么呢?开始我对这个Omit也很好奇,在很多开源的实现里都能看到它的身影。Omit本身有省略和删除的意思,那在ts里这个Omit也很有可能有着相似的操作。查了一些资料之后,学习到,Omit确实是用来删除指定成员。ts虽然没有原生内置Omit,但却可以通过其他内置类型进行实现,比如:

Omit

搭配Pick这个映射类型,就可以实现Omit的效果,我们一点点来拆分这个类型实现。

首先看等号的右侧,Pick是一个ts内置的映射类型,Pick的实现为

  type Pick<T, K extends keyof T> = {
    [P in K]: T[P];
  }

首先这个 "K extends keyof T"说明这个类型值必须为T类型属性的子集,也就是说假如有一个interface定义如下

  interface Student {
    name: string;
    age: number;
  }

在传入这个Student到Pick中时

  type PickStudent1 = Pick<Student, "name"> // 正确
  type PickStudent2 = Pick<Student, "score"> // 错误

在上面的Omit实现中,我们用到了Exclude这个条件类型,根据上文中的说明,Exclude的效果就是寻找在keyof T中有,但在K类型中没有的成员,这样就将剩余的类型过滤了出来,再去应用Pick,就获得了我们的Omit实现。

完整例子:

Omit

分享到

   
RN 容器的内存泄露排查手记
加入我们