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

为对象值比较工具函数应用泛型时遭遇索引类型错误,求语法解决方案

对象值比较工具函数应用泛型时遭遇索引类型错误,求语法解决方案

嘿,我看你这是碰到TypeScript泛型的索引约束问题啦!报错Type 'U' cannot be used to index type 'T'的原因很直白:你定义的泛型U没有被限制为T对象的合法属性名,TypeScript根本不知道这个identifier参数是不是T身上有的键,自然不允许你用它去索引T类型的对象。

咱们直接来解决问题,只需要给泛型U加一个约束,让它必须是T的键类型就好,也就是用U extends keyof T来限定。这样TypeScript就明确知道identifier是T存在的属性,就能安全地用来索引对象了。

下面是修改后的完整代码:

type Member = {
  id: string;
  firstName: string;
  lastName: string;
};

// 假设你已经定义了uniqid函数
function uniqid(): string {
  return Math.random().toString(36).slice(2);
}

const signedIn = [
  {
    id: uniqid(),
    firstName: "Joe",
    lastName: "Bloggs"
  }
];

const notSignedIn = [
  {
    id: uniqid(),
    firstName: "Mary",
    lastName: "Smith"
  },
  {
    id: uniqid(),
    firstName: "Trevor",
    lastName: "Small"
  }
];

// 关键修改:给U加上extends keyof T的约束
function duplicateObjectInArrays<T, U extends keyof T>(
  arr1: T[],
  arr2: T[],
  identifier: U
): boolean {
  // return true if there is a dupe
  return arr1.some((arr1Obj) =>
    arr2.some((arr2Obj) => arr2Obj[identifier] === arr1Obj[identifier])
  );
}

// 这里甚至可以不用显式指定泛型参数,TypeScript能自动推断出来
console.log(duplicateObjectInArrays(signedIn, notSignedIn, "id"));

简单唠下这个修改的逻辑:

  • U extends keyof T表示U必须是T对象所有键中的一个,比如对于Member类型,U只能是"id"、"firstName"或者"lastName"
  • 这样arr1Obj[identifier]和arr2Obj[identifier]的类型都会被推断为T[U],也就是对应属性的类型,比如传"id"时就是string,类型完全兼容,不会有比较的类型问题

如果之后你想更严谨一点,还可以额外约束属性值是可比较的类型(比如排除函数类型的属性),不过对于你当前的场景来说,上面的修改已经完全能解决问题啦。

备注:内容来源于stack exchange,提问作者Le Moi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 15:42:41