在 Typescript 中推断多个泛型
Infer multiple generics in Typescript
这是我希望能够执行的操作的抽象示例:
假设我有一个工具可以为我提供具有以下格式的类型:
type FunctionA<In, Out> = (input: In) => Out;
我还有另一个工具,它是一种具有以下镜像格式的方法:
const funcB = <Out, In>(input: In) => input as any as Out;
我想做的是,不使用底层类型,而是编写一个函数,从第一个工具中推断出这些类型,然后使用这些推断出的类型调用第二个工具。理想情况下它看起来像这样,尽管这段代码显然不正确:
const funcC = <Func extends FunctionA<infer I, infer O>>(input: I) => funcB<O, I>(input);
这样我就可以像这样使用它了:
/** Outside Source */
type A = FunctionA<string, number>;
/** Outside Source */
funcC<A>('text');
起初看起来似乎很简单,但我似乎无法想出办法。
谢谢,@jcalz
,这正是我想要实现的目标。解决方案是为代理函数创建辅助条件类型:
type In<F extends FunctionA<any, any>> = F extends FunctionA<infer I, any> ? I : never;
type Out<F extends FunctionA<any, any>> = F extends FunctionA<any, infer O> ? O : never;
const funcC = <F extends FunctionA<any, any>>(input: In<F>) => funcB<Out<F>, In<F>>(input);
抱歉抽象,这是我 运行 在过去尝试连接不同工具时遇到过几次的情况,但从来没有时间正确解决。可悲的是,我不记得一个具体的例子可以在问题中正确使用,而且看起来好像缺少什么。
这是我希望能够执行的操作的抽象示例: 假设我有一个工具可以为我提供具有以下格式的类型:
type FunctionA<In, Out> = (input: In) => Out;
我还有另一个工具,它是一种具有以下镜像格式的方法:
const funcB = <Out, In>(input: In) => input as any as Out;
我想做的是,不使用底层类型,而是编写一个函数,从第一个工具中推断出这些类型,然后使用这些推断出的类型调用第二个工具。理想情况下它看起来像这样,尽管这段代码显然不正确:
const funcC = <Func extends FunctionA<infer I, infer O>>(input: I) => funcB<O, I>(input);
这样我就可以像这样使用它了:
/** Outside Source */
type A = FunctionA<string, number>;
/** Outside Source */
funcC<A>('text');
起初看起来似乎很简单,但我似乎无法想出办法。
谢谢,@jcalz
,这正是我想要实现的目标。解决方案是为代理函数创建辅助条件类型:
type In<F extends FunctionA<any, any>> = F extends FunctionA<infer I, any> ? I : never;
type Out<F extends FunctionA<any, any>> = F extends FunctionA<any, infer O> ? O : never;
const funcC = <F extends FunctionA<any, any>>(input: In<F>) => funcB<Out<F>, In<F>>(input);
抱歉抽象,这是我 运行 在过去尝试连接不同工具时遇到过几次的情况,但从来没有时间正确解决。可悲的是,我不记得一个具体的例子可以在问题中正确使用,而且看起来好像缺少什么。