如何为键相同但值类型不同的两个对象定义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
相关产品推荐
相关产品推荐

