type Foo<T extends Record<string, string>> = T extends Record<infer K, infer V> ? Record<V & string, K> : never;
type FooResult = Foo<{ "key": "value" }>;
我是TS的新手,谁能给我解释一下下面的内容🙏?
为什么Record〈inferK,inferV〉中的V不是受约束的Record<string, string>
之后的字符串类型?
type Foo<T extends Record<string, string>> = T extends Record<infer K, infer V> ? Record<V & string, K> : never;
type FooResult = Foo<{ "key": "value" }>;
我是TS的新手,谁能给我解释一下下面的内容🙏?
为什么Record〈inferK,inferV〉中的V不是受约束的Record<string, string>
之后的字符串类型?
1条答案
按热度按时间ws51t4hk1#
这本质上是TypeScript缺少的一个特性;当前,当您在条件类型中执行
infer
时,新类型参数不会获得与从中推断它的类型相同的约束。V
类型参数没有继承string
约束,并且您会得到一个错误。在microsoft/TypeScript#51108这里有一个开放的特性要求做得更好;如果您有兴趣看到它的实现,那么去看看这个问题并给予它一个👍。(它可能也不会有多大帮助,但不会有什么坏处。)
现在你只需要解决这个问题,或者通过交集,如你的例子所示:
也可以在
infer
类型变量上添加extends
约束,如下所示:Playground代码链接