不扩展情况下推断通用类型

3
在下面的代码片段中,由于双变性,y的类型被推断为Bar<{}>
type Foo<A> = { type: "foo", x: A }
type Bar<A> = { type: "bar", y: A }

type FooBar<A> = Foo<A> | Bar<A>

type Opposite<A, FB extends FooBar<A>> = FB["type"] extends "foo" ? Bar<A> : Foo<A>

declare function process<A, FB extends FooBar<A>>(foo: FB): Opposite<A, FB>

const x: Foo<number> = null as any

const y = process(x) // Bar<{}>

我可以保留泛型类型 A,使得process(x)返回Bar<number>而不必显式指定吗?
1个回答

3

根据 FB 的类型约束推断 A 并不是 typescript 能够实现的。由于参数没有提供推断 A 的位置,typescript 将会推断 A 的最宽泛类型,即 {}

您可以使用条件类型从类型参数 FB 中提取 A

type Foo<A> = { type: "foo", x: A }
type Bar<A> = { type: "bar", y: A }

type FooBar<A> = Foo<A> | Bar<A>

type Opposite<A, FB extends FooBar<A>> = FB["type"] extends "foo" ? Bar<A> : Foo<A>

type FooBarParam<T> = T extends FooBar<infer A> ? A : never;
declare function process<FB extends FooBar<any>>(foo: FB): Opposite<FooBarParam<FB>, FB>

const x: Foo<number> = null as any

const y = process(x) // Bar<number>

我只是想告诉你,我对你的 TypeScript 回答印象非常深刻 :-) - zerkms
@zerkms 十分感谢 :) 被赞赏是一件很好的事情 :D - Titian Cernicova-Dragomir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接