MST

星途 面试题库

面试题:复杂场景下TypeScript泛型与类型推断的优化

现有一个复杂的前端应用,涉及多层嵌套的数据结构和函数调用。在其中一个模块中,有一个函数`transformData`,它需要处理不同类型的数组,数组元素可能是对象,对象又有不同的属性结构。要求通过泛型和类型推断,在保证类型安全的前提下,优化该函数,使其能够高效地处理各种数据情况,同时需要考虑类型推断的准确性和性能。请给出实现思路以及关键代码片段,并解释其中泛型和类型推断的设计要点。
10.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义泛型类型参数:为了处理不同类型的数组和数组内对象,定义泛型类型参数,让函数可以接受任意类型的数组。
  2. 类型推断:利用TypeScript的类型推断机制,在函数内部根据传入的数组元素类型,推断对象的属性结构。
  3. 条件类型:使用条件类型来处理不同类型的数组元素,确保对不同结构的对象进行正确的处理。
  4. 性能考虑:避免过度使用复杂的类型操作,因为复杂类型操作可能会增加编译时间,但对运行时性能无影响。

关键代码片段

function transformData<T extends { [key: string]: any }[]>(data: T): T {
    return data.map((item) => {
        // 这里可以根据对象的具体结构进行处理
        return item;
    });
}

泛型和类型推断的设计要点

  1. 泛型参数定义T extends { [key: string]: any }[] 定义了泛型 T,它是一个数组类型,数组元素是具有任意属性的对象。这样可以保证传入的数组结构满足要求,同时保持灵活性。
  2. 类型推断:在 map 函数中,TypeScript 会根据传入数组的类型推断出 item 的类型,从而在对 item 进行操作时保证类型安全。例如,如果传入的数组元素是 {name: string, age: number} 类型的对象,item 就会被推断为该类型,对 item.nameitem.age 的操作都是类型安全的。
  3. 条件类型的潜在应用:如果需要针对不同结构的对象进行不同处理,可以使用条件类型。例如:
type IsString<T> = T extends string? true : false;
function transformData<T extends { [key: string]: any }[]>(data: T): T {
    return data.map((item) => {
        if ('name' in item && typeof item.name ==='string') {
            // 对有name属性且为字符串的对象进行处理
        }
        return item;
    });
}

这里通过 in 操作符和 typeof 结合,利用类型推断和条件判断,对特定结构的对象进行针对性处理,同时保证类型安全。