interview
typescript-frontend
什么是 TypeScript 的条件类型

前端 TypeScript 面试题, 什么是 TypeScript 的条件类型?

前端 TypeScript 面试题, 什么是 TypeScript 的条件类型?

QA

Step 1

Q:: 什么是 TypeScript 的条件类型?

A:: TypeScript 的条件类型(Conditional Types)是基于条件判断来确定类型的一种类型。它的语法类似于三元运算符T extends U ? X : Y,其中,T extends U 表示条件判断,如果条件为真,类型为 X,否则类型为 Y。条件类型在构建复杂类型时非常有用,允许根据类型信息来做出判断,从而生成新的类型。

Step 2

Q:: 如何定义和使用条件类型?

A:: 条件类型可以用于类型别名中定义,例如 type Example<T> = T extends string ? string : number;,这里定义了一个条件类型,传入类型参数 T 如果是 string,则 Example 的类型是 string,否则是 number。这种类型在处理联合类型、映射类型或者泛型时非常有用。

Step 3

Q:: 条件类型在实际开发中有哪些应用场景?

A:: 条件类型常用于构建灵活的工具类型(utility types),比如 TypeScript 内置的工具类型 Exclude<T, U>Extract<T, U> 就是基于条件类型实现的。它们可以用于从联合类型中排除某些类型或提取某些类型,这在处理类型转换、API 数据结构定义时特别有用。

Step 4

Q:: 如何在 TypeScript 中使用 infer 关键字?

A:: infer 关键字在条件类型中用于从类型中推断出某个部分的类型。它通常与条件类型结合使用,比如 type ReturnType<T> = T extends (...args: any[]) => infer R ? R : any; 这个条件类型用来推断函数类型 T 的返回值类型 R

Step 5

Q:: 你能举例说明 infer 在条件类型中的实际使用吗?

A:: 当然,例如:type FirstElement<T> = T extends [infer U, ...any[]] ? U : never; 这个条件类型用来获取元组类型的第一个元素的类型。infer U 推断出元组中的第一个类型,如果元组不满足条件,则返回 never 类型。

用途

TypeScript 的条件类型非常适合在类型安全的环境中处理复杂的类型逻辑。它在大型代码库中非常有用,尤其是在需要根据类型动态生成新的类型时,可以确保代码的类型安全性。在实际生产环境下,条件类型可以用于 API 的类型推导、类型映射、泛型库开发等场景,帮助开发者减少手动类型定义,增强代码的可维护性和可扩展性。\n

相关问题

🦆
什么是泛型Generics?

泛型是一种在编写代码时使类型参数化的工具,可以让一个函数、接口或类支持多种类型,而不具体规定类型。使用泛型能够增强代码的复用性,并保持类型安全。

🦆
TypeScript 中如何定义联合类型?

联合类型使用竖线 | 来分隔不同的类型,表示某个值可以是这些类型中的任意一种。例如 type Union = string | number; 表示一个变量可以是 stringnumber 类型。

🦆
什么是交叉类型Intersection Types?

交叉类型使用 & 运算符表示,表示一个类型需要同时满足多个类型。例如 type Intersection = Type1 & Type2; 表示一个类型既是 Type1 又是 Type2,常用于对象类型的组合。

🦆
TypeScript 中工具类型Utility Types有哪些常用的?

TypeScript 提供了一些内置的工具类型,用于常见的类型操作,例如 Partial<T> 将所有属性设为可选,Readonly<T> 将所有属性设为只读,Pick<T, K> 从类型 T 中选择一组属性 KOmit<T, K> 从类型 T 中剔除一组属性 K。这些工具类型能够简化对复杂类型的操作。

🦆
如何定义 TypeScript 的映射类型Mapped Types?

映射类型用于基于已有类型创建新类型,常见形式是 type NewType<T> = { [K in keyof T]: T[K] };,这会基于类型 T 创建一个类型,且属性的类型保持一致。映射类型在处理对象结构时特别有用,能够方便地实现对类型属性的批量操作。