You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建支持两种不同类型的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:25:33