面试题答案
一键面试在TypeScript中,我们可以这样实现 GetValueType
泛型类型:
type GetValueType<T> =
T extends (infer U)[] ? U :
T extends object ? { [K in keyof T]: T[K] }[keyof T] :
never;
泛型推导过程
-
数组类型判断:
T extends (infer U)[] ? U :
这里使用了条件类型
T extends (infer U)[]
,infer U
表示在T
是数组类型的情况下,推断出数组元素的类型U
。如果T
是数组类型,那么就返回U
,即数组元素的类型。 -
对象类型判断:
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]
获取这个新类型所有值的联合类型。 -
其他类型处理:
never;
如果
T
既不是数组也不是对象,就返回never
类型。
条件类型的作用
条件类型 T extends U ? X : Y
在这个泛型类型实现中起到了核心作用。它根据 T
是否满足某个条件(如是否为数组类型、是否为对象类型),来决定返回 X
还是 Y
。通过链式的条件类型,可以针对不同的类型情况进行不同的类型推导和处理,实现了根据输入类型 T
的不同情况,返回不同的类型的功能。