实现思路
- 函数重载:定义多个同名函数,但参数列表或返回值类型不同,根据传入参数类型来决定调用哪个函数。
- 泛型:使用泛型来处理不同类型的数据,增加函数的通用性。对于数组,泛型
T
表示数组元素类型;对于对象,泛型 K
表示对象键的类型。
关键点
- 数组处理:根据操作类型进行不同的计算,如求和、求平均值等。
- 对象处理:根据传入的键名获取对象对应的值。
- 类型安全:通过函数重载和泛型确保在编译时就能发现类型错误。
代码实现(以 TypeScript 为例)
// 函数重载声明
function processData<T>(data: T[], operation: 'sum'): number;
function processData<T>(data: T[], operation: 'average'): number;
function processData<K extends keyof any>(data: Record<K, any>, key: K): any;
// 函数实现
function processData<T, K extends keyof any>(data: T[] | Record<K, any>, operationOrKey: 'sum' | 'average' | K): number | any {
if (Array.isArray(data)) {
if (operationOrKey === 'sum') {
return (data as number[]).reduce((acc, val) => acc + val, 0);
} else if (operationOrKey === 'average') {
const sum = (data as number[]).reduce((acc, val) => acc + val, 0);
return sum / (data as number[]).length;
}
} else {
return (data as Record<K, any>)[operationOrKey];
}
throw new Error('Invalid operation or key');
}
使用示例
// 处理数组
const numbers = [1, 2, 3, 4, 5];
const sumResult = processData(numbers, 'sum');
const averageResult = processData(numbers, 'average');
// 处理对象
const obj = { name: 'John', age: 30 };
const nameResult = processData(obj, 'name');
const ageResult = processData(obj, 'age');