You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 12:45:03