为对象值比较工具函数应用泛型时遭遇索引类型错误,求语法解决方案
对象值比较工具函数应用泛型时遭遇索引类型错误,求语法解决方案
嘿,我看你这是碰到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
相关产品推荐
相关产品推荐

