探索 Conditional Type:揭秘 TypeScript 中的类型操作利器
2023-10-17 11:46:06
前言
TypeScript 作为一门备受瞩目的编程语言,以其强大的类型系统和灵活的语法深受广大开发者的喜爱。而在 TypeScript 中,Conditional Type 作为类型操作的利器,更是锦上添花,为我们提供了更加灵活和强大的类型操作能力。
Conditional Type 基础用法
Conditional Type 的基本语法如下:
type NewType = TypeA extends TypeB ? TypeC : TypeD;
其中,TypeA
和 TypeB
是两个类型,?
表示判断,:
表示取值,TypeC
和 TypeD
是两个不同的类型。如果 TypeA
满足 TypeB
的条件,则 NewType
等于 TypeC
;否则,NewType
等于 TypeD
。
例如,我们有如下代码:
type IsNumber<T> = T extends number ? true : false;
该代码定义了一个名为 IsNumber
的泛型类型,用于判断一个类型是否为数字类型。如果 T
满足数字类型的条件,则 IsNumber<T>
为 true
;否则,IsNumber<T>
为 false
。
extends 和 infer 的其他用法
除了上述基础用法外,extends
和 infer
关键字还有一些其他用法,可以帮助我们更加灵活地操作类型。
extends 的其他用法
-
联合类型约束:
type UnionConstraint<T> = T extends string | number ? T : never;
该代码定义了一个名为
UnionConstraint
的泛型类型,用于约束一个类型只能是字符串类型或数字类型。如果T
满足字符串类型或数字类型的条件,则UnionConstraint<T>
等于T
;否则,UnionConstraint<T>
等于never
。 -
类型映射:
type MapType<T> = { [K in keyof T]: T[K] extends string ? T[K].toUpperCase() : T[K]; };
该代码定义了一个名为
MapType
的泛型类型,用于将一个类型的字符串属性转换为大写。如果T
的属性是字符串类型,则将其转换为大写;否则,保持原样。
infer 的其他用法
-
类型推断:
type InferredType<T> = T extends Promise<infer U> ? U : T;
该代码定义了一个名为
InferredType
的泛型类型,用于推断一个类型的 Promise 的泛型参数类型。如果T
是一个 Promise 类型,则InferredType<T>
等于T
的泛型参数类型;否则,InferredType<T>
等于T
。 -
条件类型别名:
type ConditionalAlias<T> = T extends string ? string : number;
该代码定义了一个名为
ConditionalAlias
的条件类型别名,用于根据一个类型是否为字符串类型来选择不同的类型。如果T
是一个字符串类型,则ConditionalAlias<T>
等于string
;否则,ConditionalAlias<T>
等于number
。
结语
Conditional Type 作为 TypeScript 中的类型操作利器,为我们提供了更加灵活和强大的类型操作能力。通过理解 Conditional Type 的基础用法和 extends、infer 关键字的其他用法,我们可以更加熟练地操作类型,编写更加健壮和可维护的 TypeScript 代码。