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
相关产品推荐
相关产品推荐

