面试题答案
一键面试实现思路
- 定义泛型类型参数:为了处理不同类型的数组和数组内对象,定义泛型类型参数,让函数可以接受任意类型的数组。
- 类型推断:利用TypeScript的类型推断机制,在函数内部根据传入的数组元素类型,推断对象的属性结构。
- 条件类型:使用条件类型来处理不同类型的数组元素,确保对不同结构的对象进行正确的处理。
- 性能考虑:避免过度使用复杂的类型操作,因为复杂类型操作可能会增加编译时间,但对运行时性能无影响。
关键代码片段
function transformData<T extends { [key: string]: any }[]>(data: T): T {
return data.map((item) => {
// 这里可以根据对象的具体结构进行处理
return item;
});
}
泛型和类型推断的设计要点
- 泛型参数定义:
T extends { [key: string]: any }[]
定义了泛型T
,它是一个数组类型,数组元素是具有任意属性的对象。这样可以保证传入的数组结构满足要求,同时保持灵活性。 - 类型推断:在
map
函数中,TypeScript 会根据传入数组的类型推断出item
的类型,从而在对item
进行操作时保证类型安全。例如,如果传入的数组元素是{name: string, age: number}
类型的对象,item
就会被推断为该类型,对item.name
或item.age
的操作都是类型安全的。 - 条件类型的潜在应用:如果需要针对不同结构的对象进行不同处理,可以使用条件类型。例如:
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
结合,利用类型推断和条件判断,对特定结构的对象进行针对性处理,同时保证类型安全。