如何编写支持多对象输入的TypeScript通用函数?
当然可以,两种方案都能实现你的需求,下面分别说明:
方案一:泛型函数(推荐,更符合TypeScript类型安全特性)
如果Object set A和Object set B有共同属性/方法,可以通过泛型约束复用核心逻辑;即便结构差异较大,也能结合联合类型让函数兼容两者。
举个实际代码示例:
先定义两个对象类型:
// Object set A type ObjectA = { id: number; name: string; type: 'A'; }; // Object set B type ObjectB = { id: number; label: string; type: 'B'; };
带约束的泛型实现
利用两者共有的id属性做泛型约束,同时通过类型守卫处理差异逻辑:
function processObject<T extends { id: number }>(obj: T) { // 复用的核心逻辑,比如基于id做统一处理 console.log(`Processing object with id: ${obj.id}`); // 针对不同对象类型做差异化处理 if ('name' in obj) { console.log(`Object A name: ${obj.name}`); } else if ('label' in obj) { console.log(`Object B label: ${obj.label}`); } } // 两种对象都能直接传入 processObject({ id: 1, name: 'Test A', type: 'A' }); processObject({ id: 2, label: 'Test B', type: 'B' });
简化联合类型实现
如果只是需要函数兼容两种类型输入,也可以直接用联合类型(本质是泛型的简化形式):
function processObject(obj: ObjectA | ObjectB) { console.log(`Processing object with id: ${obj.id}`); // 通过字面量类型做精准判断 if (obj.type === 'A') { console.log(obj.name); } else { console.log(obj.label); } }
方案二:多参数分支判断(适合逻辑差异较大的场景)
如果需要同时接收多个对象参数,或者不同对象的处理逻辑差异明显,可以用if-else结合类型守卫实现:
function processObjects(...objs: (ObjectA | ObjectB)[]) { objs.forEach(obj => { if (obj.type === 'A') { // Object A专属逻辑 console.log(`Handling Object A: ${obj.name}`); } else { // Object B专属逻辑 console.log(`Handling Object B: ${obj.label}`); } // 两者共用的逻辑放在这里 console.log(`Common logic for id: ${obj.id}`); }); } // 支持传入混合类型的参数 processObjects( { id: 1, name: 'A1', type: 'A' }, { id: 2, label: 'B1', type: 'B' } );
注意:使用分支判断时,要确保TypeScript能通过类型守卫(比如in操作符、字面量类型判断、自定义类型守卫函数)正确推断类型,避免出现类型错误。
总结:核心逻辑复用度高时,优先用泛型+类型守卫;逻辑分支差异大或需处理多参数时,联合类型+if-else分支更直观。
内容的提问来源于stack exchange,提问作者luffy
相关产品推荐
相关产品推荐

