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

TypeScript中Record<infer K, infer V>的V未保留string约束的原因咨询

TypeScript泛型推断问题解答

示例代码

type Foo<T extends Record<string, string>> = T extends Record<infer K, infer V> ? Record<V & string, K> : never;

type FooResult = Foo<{ "key": "value" }>;

用户问题

我是TypeScript新手,恳请各位帮忙解答以下问题🙏?

为何在为泛型T添加了extends Record<string, string>的约束后,T extends Record<infer K, infer V>中推断得到的V并非string类型?

解答

这是因为TypeScript的条件类型推断会优先提取实际传入类型的具体信息,而非直接使用泛型约束的宽泛类型:

  • 泛型约束T extends Record<string, string>只是保证T的属性值属于string的子类型(包括字符串字面量,比如"value"),并不强制推断时必须用string这个宽泛类型。
  • 当你传入{ "key": "value" }时,这个类型的属性值是字面量类型"value",它是string的子类型,符合约束条件。此时条件推断infer V会精准提取这个字面量类型,而不是自动拓宽为string。
  • 如果希望V被推断为宽泛的string,可以手动拓宽类型,比如修改为:
    type Foo<T extends Record<string, string>> = T extends Record<infer K, infer V> ? Record<V extends string ? string : never, K> : never;
    

内容的提问来源于stack exchange,提问作者leo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:40:37