面试题答案
一键面试假设给定的复杂TypeScript类型定义如下:
type ComplexType = {
mainObj: {
subObj: {
value: number;
list: number[];
}[];
};
};
编写的箭头函数如下:
const operateOnComplexType = (data: ComplexType) => {
data.mainObj.subObj.forEach(sub => {
sub.value = sub.value * 2;
sub.list = sub.list.map(num => num + 1);
});
return data;
};
箭头函数与TypeScript类型系统的协同工作
- 参数类型明确:箭头函数的参数
data
明确指定为ComplexType
,这样TypeScript编译器就知道传入的数据结构,从而可以对函数内部对data
的操作进行类型检查。 - 返回值类型推断:由于函数体最后返回
data
,TypeScript能根据data
的类型推断出返回值类型为ComplexType
,不需要显式声明返回值类型。
可能遇到的类型推断问题及解决方案
- 属性不存在问题:如果在函数内部访问
data
中不存在的属性,TypeScript会报错。例如data.mainObj.nonExistentProp
,解决方案是确保操作的属性在类型定义中确实存在。 - 类型不匹配问题:如果对属性的操作不符合其类型定义,如
sub.value = 'not a number'
,TypeScript会报错。需要按照类型定义的要求进行操作,保证类型匹配。 - 函数重载与泛型:如果函数需要处理多种不同但相关的复杂类型,可以使用函数重载或者泛型来增强类型的灵活性。例如:
type AnotherComplexType = {
mainObj: {
subObj: {
otherValue: string;
otherList: string[];
}[];
};
};
function operateOnComplexType<T extends { mainObj: { subObj: any[] } }>(data: T): T {
data.mainObj.subObj.forEach(sub => {
// 根据不同类型进行相应操作
});
return data;
}
这样函数可以处理不同结构但有相似部分的复杂类型。