TypeScript如何定义匹配对象特定值类型的键的泛型约束
错误成因
该报错的本质是TypeScript类型系统的推导限制:无法基于K extends KeysMatching<T, V>的泛型约束,反向推导出T[K]一定符合V类型。KeysMatching工具类型返回的是符合条件的键的联合类型,当前TypeScript版本不会自动建立「键属于该联合→对应属性值为V类型」的映射关系,因此手动标注返回值为boolean时,TS会判定类型不匹配。
解决方案
方案1:调整泛型约束,无需额外工具类型
直接通过Record约束属性的类型,TS可以直接识别类型匹配,是最简单的实现方式:
function getBooleanProp<T extends Record<K, boolean>, K extends keyof T>(obj: T, flagKey: K): boolean { return obj[flagKey]; }
方案2:保留KeysMatching工具类型,调整返回值写法
如果需要保留通用的KeysMatching工具类型,可以直接将返回值标注为T[K],调用时会自动推导为你指定的目标类型:
type KeysMatching<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T]; function getFlag<T, K extends KeysMatching<T, boolean>>(obj: T, flagKey: K): T[K] { return obj[flagKey]; }
如果必须显式标注返回值为固定类型,可以加安全的类型断言:
function getFlag<T, K extends KeysMatching<T, boolean>>(obj: T, flagKey: K): boolean { return obj[flagKey] as boolean; }
内容的提问来源于stack exchange,提问作者Greg Soltis
相关产品推荐
相关产品推荐

