推荐答案
条件类型(Conditional Types)是 TypeScript 中一种强大的类型操作工具,它允许我们根据某些条件来选择不同的类型。条件类型的语法类似于三元运算符,形式为 T extends U ? X : Y
,其中 T
是待检查的类型,U
是条件类型,X
和 Y
是根据条件选择的结果类型。
应用场景
类型推断与类型映射:条件类型常用于类型推断和类型映射中,特别是在处理泛型时。例如,我们可以根据传入的泛型类型来决定返回的类型。
类型过滤:条件类型可以用于过滤掉某些不需要的类型。例如,我们可以定义一个条件类型来过滤掉
null
和undefined
。递归类型定义:条件类型可以与递归结合使用,用于定义复杂的类型结构。例如,我们可以定义一个递归的条件类型来处理嵌套的对象类型。
类型兼容性检查:条件类型可以用于检查两个类型之间的兼容性,并根据兼容性结果选择不同的类型。
示例代码
type NonNullable<T> = T extends null | undefined ? never : T; type Flatten<T> = T extends Array<infer U> ? U : T; type IsString<T> = T extends string ? true : false;
本题详细解读
条件类型的基本语法
条件类型的语法形式为 T extends U ? X : Y
,其中:
T
是待检查的类型。U
是条件类型。X
是当T
满足U
时的结果类型。Y
是当T
不满足U
时的结果类型。
类型推断与类型映射
在类型推断与类型映射中,条件类型可以帮助我们根据传入的泛型类型来决定返回的类型。例如:
type TypeName<T> = T extends string ? "string" : T extends number ? "number" : T extends boolean ? "boolean" : T extends undefined ? "undefined" : T extends Function ? "function" : "object";
在这个例子中,TypeName
类型会根据传入的泛型类型 T
返回相应的字符串类型。
类型过滤
条件类型可以用于过滤掉某些不需要的类型。例如,NonNullable
类型可以过滤掉 null
和 undefined
:
type NonNullable<T> = T extends null | undefined ? never : T;
在这个例子中,如果 T
是 null
或 undefined
,则返回 never
类型,否则返回 T
本身。
递归类型定义
条件类型可以与递归结合使用,用于定义复杂的类型结构。例如,Flatten
类型可以用于展平嵌套的数组类型:
type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T;
在这个例子中,Flatten
类型会递归地展平嵌套的数组类型,直到遇到非数组类型为止。
类型兼容性检查
条件类型可以用于检查两个类型之间的兼容性,并根据兼容性结果选择不同的类型。例如,IsString
类型可以用于检查一个类型是否是 string
类型:
type IsString<T> = T extends string ? true : false;
在这个例子中,如果 T
是 string
类型,则返回 true
,否则返回 false
。