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
相关产品推荐
相关产品推荐

