面试题答案
一键面试Flatten
类型别名分析:type Flatten<T> = T extends Array<infer U> ? U : T;
这是一个条件类型。它检查类型T
是否是数组类型。如果是数组类型,它推断出数组元素的类型U
并返回U
;如果不是数组类型,它直接返回T
。- 对于
let result1: Flatten<typeof arr>;
,这里typeof arr
是number[][]
,满足T extends Array<infer U>
条件,此时T
是number[][]
,推断出U
为number[]
。所以result1
的推断类型是number[]
。
DeepFlatten
类型别名分析:type DeepFlatten<T> = T extends Array<infer U> ? DeepFlatten<U> : T;
这也是一个条件类型。同样检查T
是否是数组类型,如果是,它递归调用DeepFlatten
处理数组元素类型U
;如果不是数组类型,直接返回T
。- 对于
let result2: DeepFlatten<typeof arr>;
,typeof arr
是number[][]
,满足T extends Array<infer U>
,此时T
是number[][]
,推断出U
为number[]
。然后对U
(即number[]
)继续应用DeepFlatten
,number[]
又满足T extends Array<infer U>
,此时T
是number[]
,推断出U
为number
,递归结束。所以result2
的推断类型是number
。
综上所述,result1
的推断类型是 number[]
,result2
的推断类型是 number
。