如何创建支持两种不同类型的TypeScript泛型函数?
实现适配两种不可互换类型的泛型辅助函数
需要创建一个泛型辅助函数,支持两种不可互换的类型,同一时间仅能使用其中一种类型进行比较操作。
初始代码与问题
原代码定义了两种类型,但函数参数允许混合传入不同类型,无法保证同一时间仅使用一种类型:
type UserType = { id: string; user: string }; type AdminType = { id: string; admin: string }; // 初始函数:允许混合传入UserType和AdminType,不符合需求 const compareByLoop = (firstObject: UserType | AdminType, secondObject: UserType | AdminType) => { for (const key in firstObject) { if (firstObject[key as keyof UserType | keyof AdminType] !== secondObject[key as keyof UserType | keyof AdminType]) { alert('对象不相同'); } } }; // 使用示例 const objectUser1: UserType = { id: '234234', user: 'jack' }; const objectUser2: UserType = { id: '454366546', user: 'max' }; // compareByLoop(objectUser1, objectUser2) → 会触发提示 const objectAdmin1: AdminType = { id: '44433', admin: 'joe' }; const objectAdmin2: AdminType = { id: '7778', admin: 'alfred' }; // compareByLoop(objectAdmin1, objectAdmin2) → 会触发提示
重构中的问题
你尝试用泛型重构,但<T, U>加T | U的写法仍未限制参数必须为同一类型,还错误指定了返回值为never:
// 重构尝试:仍允许混合类型,返回值never不合理 const compareByLoop = <T, U>(firstObject: T | U, secondObject: T | U): never => { for (const key in firstObject) { if (firstObject[key as keyof T | keyof U] !== secondObject[key as keyof T | keyof U]) { alert('are not the same'); } } };
正确的泛型实现
使用单个泛型并约束为目标类型的联合,确保两个参数必须为同一类型:
type UserType = { id: string; user: string }; type AdminType = { id: string; admin: string }; // 泛型约束:T只能是UserType或AdminType,且两个参数类型必须一致 const compareByLoop = <T extends UserType | AdminType>(firstObject: T, secondObject: T) => { for (const key in firstObject) { // 自动推导key为T的键,无需手动断言 if (firstObject[key as keyof T] !== secondObject[key as keyof T]) { alert('对象不相同'); // 可选:找到差异后提前终止循环 return; } } alert('对象完全相同'); }; // 合法调用:同类型参数 compareByLoop(objectUser1, objectUser2); compareByLoop(objectAdmin1, objectAdmin2); // 非法调用:混合不同类型,TypeScript会报错 // compareByLoop(objectUser1, objectAdmin1); // 类型检查不通过
关键说明
- 用
<T extends UserType | AdminType>约束泛型,确保T只能是两种类型之一 - 两个参数都指定为T,强制要求传入的两个对象类型完全一致,避免混合使用
- 自动推导键的类型,减少不必要的类型断言,提升类型安全性
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

