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

TypeScript中如何使用未知键名的对象作为函数参数?

TypeScript版本的shallowEqual实现

下面是适配你需求的TypeScript版本shallowEqual函数,它能接收任意键名的对象作为参数,同时保留原JavaScript函数的浅比较逻辑:

function shallowEqual<T extends Record<string, unknown>>(object1: T, object2: T): boolean {
  const keys1 = Object.keys(object1);
  const keys2 = Object.keys(object2);

  // 键数量不同直接返回false
  if (keys1.length !== keys2.length) {
    return false;
  }

  // 遍历所有键,逐一比较值的引用或原始值
  for (const key of keys1) {
    if (object1[key] !== object2[key]) {
      return false;
    }
  }

  return true;
}

类型说明

  • 用T extends Record<string, unknown>作为泛型约束,确保传入的参数是键为字符串、值为任意类型的对象,完美适配“不知道键名”的需求。
  • 泛型T保证两个输入对象的结构一致,避免传入完全不相关的对象类型(如果需要允许比较不同结构的对象,可以调整约束)。
  • 保留原函数的核心逻辑:先比较键的数量,再逐一比较对应值的严格相等(===),浅比较逻辑和原JavaScript完全一致。

扩展:支持不同结构对象的比较

如果需要比较结构可能不同的两个对象(比如一个对象有额外的键),可以调整类型约束并增加键存在性检查:

function shallowEqual(object1: object, object2: object): boolean {
  const keys1 = Object.keys(object1);
  const keys2 = Object.keys(object2);

  if (keys1.length !== keys2.length) {
    return false;
  }

  for (const key of keys1) {
    // 检查键是否存在于第二个对象,再比较值
    if (!(key in object2) || (object1 as Record<string, unknown>)[key] !== (object2 as Record<string, unknown>)[key]) {
      return false;
    }
  }

  return true;
}

这个版本放弃了泛型的结构一致性约束,允许传入任意对象,通过类型断言解决索引访问的类型问题,行为和原JavaScript函数完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:45:42