MST

星途 面试题库

面试题:复杂场景下TypeScript泛型推导与条件类型结合

实现一个泛型类型 `GetValueType`,它接受一个对象类型 `T` 作为参数。如果 `T` 是一个数组类型,返回数组元素的类型;如果 `T` 是一个对象类型,返回其值的联合类型;如果 `T` 既不是数组也不是对象,返回 `never`。请详细说明泛型推导过程以及条件类型在其中起到的作用。
19.1万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

在TypeScript中,我们可以这样实现 GetValueType 泛型类型:

type GetValueType<T> = 
    T extends (infer U)[] ? U :
    T extends object ? { [K in keyof T]: T[K] }[keyof T] :
    never;

泛型推导过程

  1. 数组类型判断

    T extends (infer U)[] ? U :
    

    这里使用了条件类型 T extends (infer U)[]infer U 表示在 T 是数组类型的情况下,推断出数组元素的类型 U。如果 T 是数组类型,那么就返回 U,即数组元素的类型。

  2. 对象类型判断

    T extends object ? { [K in keyof T]: T[K] }[keyof T] :
    

    T 不是数组类型时,会判断 T 是否为对象类型 T extends object。如果是对象类型,通过 { [K in keyof T]: T[K] } 创建一个新的类型,它的属性名是 T 的属性名,属性值是 T 对应属性的值。然后通过 [keyof T] 获取这个新类型所有值的联合类型。

  3. 其他类型处理

    never;
    

    如果 T 既不是数组也不是对象,就返回 never 类型。

条件类型的作用

条件类型 T extends U ? X : Y 在这个泛型类型实现中起到了核心作用。它根据 T 是否满足某个条件(如是否为数组类型、是否为对象类型),来决定返回 X 还是 Y。通过链式的条件类型,可以针对不同的类型情况进行不同的类型推导和处理,实现了根据输入类型 T 的不同情况,返回不同的类型的功能。