用最简单的话讲解Utility Types-NonNullable

653 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

背景

大家好,我是梅利奥猪猪,转眼间,Utility Types系列已经讲了7篇了,讲解了8个Utility Type(其中有一篇讲了2个),不知道大家看了有没有收获?离活动黄金矿工只剩一篇文章了(流口水ing)!但我怎么可能为了奖品而输出学习笔记呢,这肯定不是我的作风,我只是热爱学习!大家可以监督我即使活动结束了也争取把这个系列结合官方文档全部讲完(全部翻译!)。今天按照官方文档的顺序,应该是要讲NonNullable,Let's go!

正文

官方例子

先来看下官方的例子,以及说明,直接注释讲解

Constructs a type by excluding null and undefined from Type.

type T0 = NonNullable<string | number | undefined>;

// type T0 = string | number 废话文学赛高,排除null和undefined,那T0只剩string和number了
     
type T1 = NonNullable<string[] | null | undefined>;

// type T1 = string[] 废话文学赛高,排除null和undefined,那T1只剩string[]

哎,看完这个NonNullable,我后悔没有把这个如此简单的Utility Type放在之前的Exclude&Extract一起讲了,毕竟很简单实现上也很接近,不过也好,水文+1

源码讲解

直接上源码

/**
 * Exclude null and undefined from T
 */
type NonNullable<T> = T extends null | undefined ? never : T;

是不是那个熟悉的三目,我们结合官方例子type T0 = NonNullable<string | number | undefined>;来讲解吧

  • string extends null | undefined该表达式为fale,所以取T,即返回string
  • number extends null | undefined该表达式为fale,所以取T,即返回number
  • undefined extends null | undefined该表达式为true,所以取never,即不取这个类型
  • 最终T0的类型就是type T0 = string | number

鼓掌,完结撒花!

参考