面试题答案
一键面试type IfEquals<A, B, X, Y> = (<T>() => T extends A? 1 : 2) extends (<T>() => T extends B? 1 : 2)? X : Y;
原理解释
- 条件类型基础:条件类型
T extends U? X : Y
用于检查类型T
是否可以赋值给类型U
。如果可以,则返回X
,否则返回Y
。 - 函数类型的比较:这里通过定义两个箭头函数类型
<T>() => T extends A? 1 : 2
和<T>() => T extends B? 1 : 2
。这两个函数类型在T
为任意类型时,检查T
是否可赋值给A
或B
并返回不同的字面量类型(1 或 2)。 - 类型相等判断:通过比较这两个函数类型是否相等来间接判断
A
和B
是否相等。因为函数类型的比较会考虑其参数和返回值类型,在这种情况下,只有当A
和B
严格相等时,这两个函数类型才会相等。所以当这两个函数类型相等时,返回X
,否则返回Y
。
应用场景
- 类型安全的代码复用:在一些通用的工具函数或组件中,根据传入的不同类型参数,返回不同的类型。例如,在一个根据类型生成默认值的函数中,如果传入的类型是已知的特定类型(严格相等),返回一个特定的默认值类型;否则返回另一种默认值类型。
- 类型迁移和适配:在代码库升级或重构过程中,可能需要根据旧类型和新类型的对应关系进行不同的处理。通过
IfEquals
工具类型,可以在类型层面进行判断并做出相应的处理,使得代码在保持类型安全的同时实现平滑过渡。