阿宝哥精心准备的《轻松学 TypeScript》 视频教程已经更新到第十期了,通过形象生动的动画,让你轻松搞懂 TypeScript 的难点和核心知识点!,你用过 Exclude、Extract、NonNullable、Parameters 和 ReturnType 这些工具类型吗?,你知道它们内部是如何工作的吗?如果你想彻底掌握它们且实现自己的工具类型,那么本文千万不要错过。上面看到的那些内置工具类型,它们内部使用了 TypeScript 2.8 版本引入的条件类型(Conditional Types)。,该类型的语法如下:,其中 T、U、X 和 Y 这些都是类型占位符。你可以这样理解该语法,当类型 T 可以赋值给类型 U 时,那么返回类型 X,否则返回类型 Y。,看到这里你是不是也想到了 JavaScript 中的三元表达式。那么条件类型有什么用呢?这里我们来举个例子:,在以上代码中,我们定义了 IsString 工具类型。使用该工具类型,我们可以判断传给类型参数 T 的实际类型是否为字符串类型。除了判断单一类型之外,利用条件类型和条件链,我们还可以同时判断多种类型。,下面我们来看一下如何实现该功能:,在以上代码中,我们定义了一个新的 TypeName 工具类型,在该工具类型中,我们使用了条件链。为了便于大家理解条件链,我们以 JavaScript 三元表达式为例,来演示一下它的作用。,现在问题来了,对于前面定义的 TypeName 工具类型来说,如果传入的类型是联合类型的话,那么将返回什么结果?下面我们来验证一下:,为什么 T10 和 T11 类型返回的是联合类型呢?这是因为 TypeName 属于分布式条件类型。在条件类型中,如果被检查的类型是一个 “裸” 类型参数,即没有被数组、元组或 Promise 等包装过,则该条件类型被称为分布式条件类型。对于分布式条件类型来说,当传入的被检查类型是联合类型的话,在运算过程中会被分解成多个分支。,为了便于大家理解,我们来举个例子:,由以上结果可知,如果条件类型中的类型参数 T 被包装过,该条件类型就不属于分布式条件类型,所以在运算过程中就不会被分解成多个分支。,了解完条件类型和分布式条件类型的知识点,我们来举例演示一下 TypeScript 内置工具类型 Exclude 的执行流程。,掌握了条件类型之后,再结合往期文章中介绍的映射类型,我们就可以实现一些有用的工具类型。比如实现 FunctionProperties 和 NonFunctionProperties 等工具类型。,在以上代码中,利用上述的工具类型,我们就可以轻松地提取 User 对象类型中函数类型和非函数类型的属性及相关的对象类型。
© 版权声明
文章版权归作者所有,未经允许请勿转载。