MST

星途 面试题库

面试题:TypeScript复杂类型推断场景分析

假设有如下代码:`type Flatten<T> = T extends Array<infer U> ? U : T; type DeepFlatten<T> = T extends Array<infer U> ? DeepFlatten<U> : T; let arr: number[][] = [[1], [2, 3]]; let result1: Flatten<typeof arr>; let result2: DeepFlatten<typeof arr>;` 请详细分析`Flatten`和`DeepFlatten`类型别名在这段代码中的类型推断过程,以及`result1`和`result2`的推断类型分别是什么。
22.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

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

综上所述,result1 的推断类型是 number[]result2 的推断类型是 number