// 泛型函数重载声明
function combine<T extends any[]>(a: T, b: T): T;
function combine<T extends object, U extends object>(a: T, b: U): T & U;
// 泛型函数实现
function combine(a: any, b: any): any {
if (Array.isArray(a) && Array.isArray(b)) {
return [...a, ...b];
} else if (typeof a === 'object' && typeof b === 'object') {
return {...a, ...b };
}
throw new Error('Unsupported types for combination');
}
// 测试代码
// 测试数组合并
const arr1 = [1, 2];
const arr2 = [3, 4];
const combinedArr = combine(arr1, arr2);
console.log(combinedArr); // 输出: [1, 2, 3, 4]
// 测试对象合并
const obj1 = { a: 1, b: 2 };
const obj2 = { b: 3, c: 4 };
const combinedObj = combine(obj1, obj2);
console.log(combinedObj); // 输出: { a: 1, b: 3, c: 4 }
// 处理不同类型合并逻辑及设计原因
1. **数组合并逻辑**:
- 使用扩展运算符 `...` 来合并两个数组。这种方式简洁明了,直接将两个数组的元素依次添加到新数组中。
- 设计原因:扩展运算符是 JavaScript 原生提供的合并数组的便捷方式,在 TypeScript 中同样适用,并且能够很好地与泛型配合,因为泛型约束 `T extends any[]` 确保了传入的参数是数组类型。
2. **对象合并逻辑**:
- 使用扩展运算符 `...` 来合并两个对象。新对象会包含两个对象的所有属性,同名属性后面的对象值会覆盖前面的。
- 设计原因:扩展运算符在对象合并上也非常简洁直观,符合 JavaScript 的对象合并习惯。通过泛型约束 `T extends object` 和 `U extends object` 确保传入的参数是对象类型,而 `T & U` 这种类型表示合并后的对象类型,能够准确反映合并后的对象结构,包含两个对象的所有属性。
3. **异常处理**:
- 如果传入的参数既不是数组也不是对象,抛出一个错误。这是为了保证函数只在支持的类型(数组和对象)上进行合并操作,避免意外的行为。