TypeScript的UniqueForProp工具类型返回冗余类型如何修复
问题原因
出现冗余类型的核心原因是:当泛型T是数组/元组类型时,keyof T会返回数组所有实例属性的键集合,除了元素下标之外,还包含length、push、map等数组自带的方法/属性名,遍历这些非下标键时返回的无效类型混入了最终结果。
修复方案
直接用T[number]获取数组所有元素的联合类型,再传入Get类型取对应属性路径的值即可,不需要额外遍历键,修改后的完整代码如下:
type Get<T, K> = K extends `${infer FK}.${infer L}` ? FK extends keyof T ? Get<T[FK], L> : never : K extends keyof T ? T[K] : never; // 优化后的UniqueForProp type UniqueForProp<T extends readonly Record<string, any>[], P extends string> = Readonly<Get<T[number], P>>;
验证效果
使用原测试用例验证,可得到预期的联合类型:
const data = [ { id: 123, color: "blue" }, { id: 456, color: "red" }, ] as const; type Data = typeof data; type U = UniqueForProp<Data, "id">; // 类型为 123 | 456,符合预期
该实现同时兼容嵌套属性路径的取值需求,例如传入a.b.c格式的路径也能正确返回对应属性的联合类型。
内容的提问来源于stack exchange,提问作者ken
相关产品推荐
相关产品推荐

