返回

探索 Conditional Type:揭秘 TypeScript 中的类型操作利器

前端

前言

TypeScript 作为一门备受瞩目的编程语言,以其强大的类型系统和灵活的语法深受广大开发者的喜爱。而在 TypeScript 中,Conditional Type 作为类型操作的利器,更是锦上添花,为我们提供了更加灵活和强大的类型操作能力。

Conditional Type 基础用法

Conditional Type 的基本语法如下:

type NewType = TypeA extends TypeB ? TypeC : TypeD;

其中,TypeATypeB 是两个类型,? 表示判断,: 表示取值,TypeCTypeD 是两个不同的类型。如果 TypeA 满足 TypeB 的条件,则 NewType 等于 TypeC;否则,NewType 等于 TypeD

例如,我们有如下代码:

type IsNumber<T> = T extends number ? true : false;

该代码定义了一个名为 IsNumber 的泛型类型,用于判断一个类型是否为数字类型。如果 T 满足数字类型的条件,则 IsNumber<T>true;否则,IsNumber<T>false

extends 和 infer 的其他用法

除了上述基础用法外,extendsinfer 关键字还有一些其他用法,可以帮助我们更加灵活地操作类型。

extends 的其他用法

  1. 联合类型约束:

    type UnionConstraint<T> = T extends string | number ? T : never;
    

    该代码定义了一个名为 UnionConstraint 的泛型类型,用于约束一个类型只能是字符串类型或数字类型。如果 T 满足字符串类型或数字类型的条件,则 UnionConstraint<T> 等于 T;否则,UnionConstraint<T> 等于 never

  2. 类型映射:

    type MapType<T> = {
      [K in keyof T]: T[K] extends string ? T[K].toUpperCase() : T[K];
    };
    

    该代码定义了一个名为 MapType 的泛型类型,用于将一个类型的字符串属性转换为大写。如果 T 的属性是字符串类型,则将其转换为大写;否则,保持原样。

infer 的其他用法

  1. 类型推断:

    type InferredType<T> = T extends Promise<infer U> ? U : T;
    

    该代码定义了一个名为 InferredType 的泛型类型,用于推断一个类型的 Promise 的泛型参数类型。如果 T 是一个 Promise 类型,则 InferredType<T> 等于 T 的泛型参数类型;否则,InferredType<T> 等于 T

  2. 条件类型别名:

    type ConditionalAlias<T> = T extends string ? string : number;
    

    该代码定义了一个名为 ConditionalAlias 的条件类型别名,用于根据一个类型是否为字符串类型来选择不同的类型。如果 T 是一个字符串类型,则 ConditionalAlias<T> 等于 string;否则,ConditionalAlias<T> 等于 number

结语

Conditional Type 作为 TypeScript 中的类型操作利器,为我们提供了更加灵活和强大的类型操作能力。通过理解 Conditional Type 的基础用法和 extends、infer 关键字的其他用法,我们可以更加熟练地操作类型,编写更加健壮和可维护的 TypeScript 代码。