typescript 关于Record〈inferK,inferV>中infertype的丢失

5jdjgkvh  于 2023-02-10  发布在  TypeScript
关注(0)|答案(1)|浏览(84)
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>之后的字符串类型?

ws51t4hk

ws51t4hk1#

这本质上是TypeScript缺少的一个特性;当前,当您在条件类型中执行infer时,新类型参数不会获得与从中推断它的类型相同的约束。

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

V类型参数没有继承string约束,并且您会得到一个错误。
microsoft/TypeScript#51108这里有一个开放的特性要求做得更好;如果您有兴趣看到它的实现,那么去看看这个问题并给予它一个👍。(它可能也不会有多大帮助,但不会有什么坏处。)
现在你只需要解决这个问题,或者通过交集,如你的例子所示:

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

也可以在infer类型变量上添加extends约束,如下所示:

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

Playground代码链接

相关问题