MST

星途 面试题库

面试题:深入理解TypeScript中的泛型与条件类型

结合TypeScript中的泛型(Generics)和条件类型(Conditional Types),实现一个工具类型 `IfEquals<A, B, X, Y>`。当类型 `A` 和 `B` 严格相等时,返回类型 `X`;否则返回类型 `Y`。同时,请解释该工具类型在处理复杂类型关系时的原理及应用场景。
18.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
type IfEquals<A, B, X, Y> = (<T>() => T extends A? 1 : 2) extends (<T>() => T extends B? 1 : 2)? X : Y;

原理解释

  1. 条件类型基础:条件类型 T extends U? X : Y 用于检查类型 T 是否可以赋值给类型 U。如果可以,则返回 X,否则返回 Y
  2. 函数类型的比较:这里通过定义两个箭头函数类型 <T>() => T extends A? 1 : 2<T>() => T extends B? 1 : 2。这两个函数类型在 T 为任意类型时,检查 T 是否可赋值给 AB 并返回不同的字面量类型(1 或 2)。
  3. 类型相等判断:通过比较这两个函数类型是否相等来间接判断 AB 是否相等。因为函数类型的比较会考虑其参数和返回值类型,在这种情况下,只有当 AB 严格相等时,这两个函数类型才会相等。所以当这两个函数类型相等时,返回 X,否则返回 Y

应用场景

  1. 类型安全的代码复用:在一些通用的工具函数或组件中,根据传入的不同类型参数,返回不同的类型。例如,在一个根据类型生成默认值的函数中,如果传入的类型是已知的特定类型(严格相等),返回一个特定的默认值类型;否则返回另一种默认值类型。
  2. 类型迁移和适配:在代码库升级或重构过程中,可能需要根据旧类型和新类型的对应关系进行不同的处理。通过 IfEquals 工具类型,可以在类型层面进行判断并做出相应的处理,使得代码在保持类型安全的同时实现平滑过渡。