MST

星途 面试题库

面试题:TypeScript类型推断与泛型约束的深度剖析

设计一个复杂的TypeScript泛型函数`transformArray`,它接受一个数组和一个转换函数作为参数,并返回转换后的数组。要求泛型函数使用类型推断结合泛型约束,确保转换函数的输入类型与数组元素类型匹配,输出类型是一个新的数组,其元素类型是转换函数的返回类型。详细解释在这个函数中,类型推断是如何在泛型约束的条件下工作的,以及可能遇到的类型推断陷阱和如何避免。
45.9万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试
function transformArray<T, U>(arr: T[], transform: (arg: T) => U): U[] {
    return arr.map(transform);
}

类型推断在泛型约束条件下的工作原理

  1. 类型参数定义transformArray函数使用了两个类型参数TUT表示输入数组arr的元素类型,U表示转换函数transform的返回类型。
  2. 类型推断过程:当调用transformArray时,TypeScript会根据传入的实际参数推断TU的具体类型。对于T,它会从传入的数组arr中推断出数组元素的类型。例如,如果传入[1, 2, 3]T会被推断为number。对于U,它会从转换函数transform的返回值推断。例如,如果转换函数是(num: number) => num.toString(),那么U会被推断为string
  3. 泛型约束作用:这里虽然没有显式写泛型约束(如T extends SomeType这种形式),但实际上函数签名本身就隐含了约束。transform函数的输入参数类型必须是T,这就确保了转换函数的输入类型与数组元素类型匹配。

可能遇到的类型推断陷阱及避免方法

  1. 陷阱
    • 函数重载模糊:如果有多个重载版本的transform函数,TypeScript可能无法正确推断类型。例如,假设有transform函数既可以接受string返回number,又可以接受number返回string,在调用transformArray时,TypeScript可能无法确定应该使用哪个重载版本,导致类型推断错误。
    • 复杂类型推断失败:当转换函数的返回类型是复杂类型(如函数返回一个对象,对象的属性类型依赖于输入参数),TypeScript可能无法准确推断。例如,(obj: {a: number}) => ({b: obj.a.toString()}),TypeScript可能无法正确推断出返回对象的类型细节。
  2. 避免方法
    • 明确类型参数:在调用transformArray时,显式指定类型参数。例如,transformArray<number, string>([1, 2, 3], (num) => num.toString()),这样可以避免因函数重载模糊导致的类型推断错误。
    • 使用类型别名或接口:对于复杂类型,定义类型别名或接口来明确转换函数的输入和输出类型。例如,定义interface Input { a: number; }interface Output { b: string; },然后transformArray<Input, Output>([{a: 1}], (obj: Input) => ({b: obj.a.toString()} as Output)),通过这种方式可以帮助TypeScript更准确地进行类型推断。