前端 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
类型。