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

如何为键相同但值类型不同的两个对象定义TypeScript类型?

正确的TypeScript类型定义方案

你原来的类型定义要求两个对象属于同一类型T,这会强制同一键对应的值类型完全一致,无法满足“键完全相同但值类型可不同”的需求。以下是两种可行的类型定义方案:

方案一:统一键集合泛型约束

sortComparator?: <Keys extends PropertyKey>(
  row1: Record<Keys, unknown>,
  row2: Record<Keys, unknown>,
  accessor: Keys
) => number; // 排序比较器通常返回number,可根据实际需求调整返回类型
  • 解释:通过Keys泛型锁定两个对象的键集合完全一致,Record<Keys, unknown>确保两个对象必须包含所有Keys中的键,值可以是任意类型(支持同一键对应不同类型的值),accessor被严格限制为Keys中的成员。

方案二:双泛型键匹配约束

sortComparator?: <T1, T2 extends Record<keyof T1, unknown>>(
  row1: T1,
  row2: T2,
  accessor: keyof T1
) => number;
  • 解释:T2被约束为必须包含T1的所有键,TypeScript会自动校验传入的row2键集合与row1完全一致(若row2有额外键会直接报错),同时允许同一键对应的值类型不同。

示例使用

// 符合要求的对象示例
const obj1 = {name: null, salary: 10000, age: 20};
const obj2 = {name: 'tam', salary: '300040', age: 50};

// 实现比较逻辑
const comparator: typeof sortComparator = (row1, row2, accessor) => {
  const val1 = row1[accessor];
  const val2 = row2[accessor];
  
  // 处理null、数字、字符串的比较逻辑
  if (val1 === null) return -1;
  if (val2 === null) return 1;
  if (typeof val1 === 'number' && typeof val2 === 'number') {
    return val1 - val2;
  }
  return String(val1).localeCompare(String(val2));
};

comparator(obj1, obj2, 'name'); // 合法调用
comparator(obj1, obj2, 'salary'); // 合法调用
comparator(obj1, {name: 'test'}, 'name'); // 报错:键集合不匹配

内容的提问来源于stack exchange,提问作者Ashima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:57:54