我正在开发一个使Rx Observables成为代理的开源库。
(为了简单起见,我将使用Box<A>
代替Observable<A>
)
它接受aBox<A>
并返回一个type { [P in keyof A]: Box<A[P]> }
。
细微差别:此新类型上的所有方法也应返回Box
该方法结果中的a,同时保留其params类型。所以:
Box<{ m(a:string):any }>
// becomes
{ m(a:string):Box<any> }
我面临的问题是,当我尝试代理A
具有重载方法的代理时,我仅重新定义了一个方法定义,而不是整个重载组。
简化的问题:
type Proxy<O> = { [P in keyof O]: Wrap<O[P]> }
type Wrap<O> = O extends (...a: infer P) => infer R
? (...args: P) => Proxy<R>
: Proxy<O>
class A {
m(a: number): any;
m(a: string): any;
m(...a:any[]) {}
}
let p = {} as Proxy<A>;
// p.m resolves to a single override
// m(a: string): void;
p.m('1') // > returns Proxy<any>
p.m(1) // > Error: 1 is not string
可能吗
请帮我输入。谢谢!
笔记:
无需键入即可一切正常!
您可以在此处签出该库:rxjs-proxify(在中定义的类型src/proxify.ts
)
映射重载函数存在问题。如果只使用O extends (...a: infer P) => infer R
它,则实际上总是会得到最后的重载。无法获取任意数量的重载的参数,但是可以使用此处概述的技术创建条件类型以获取最多一定数量的重载的重载参数。
type Proxy<O> = { [P in keyof O]: OverloadedWrap<O[P]> }
type OverloadedWrap<T> =
T extends
{ (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4 } ?
{ (...args: A1): Proxy<R1>; (...args: A2): Proxy<R2>; (...args: A3): Proxy<R3>; (...args: A4): Proxy<R4>; }:
T extends
{ (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; } ?
{ (...args: A1): Proxy<R1>; (...args: A2): Proxy<R2>; (...args: A3): Proxy<R3>; }:
T extends
{ (...args: infer A1): infer R1; (...args: infer A2): infer R2; } ?
{ (...args: A1): Proxy<R1>; (...args: A2): Proxy<R2>; }:
T extends
{ (...args: infer A1): infer R1; } ?
{ (...args: A1): Proxy<R1>; }:
Proxy<T>
type Wrap<O> = O extends (...a: infer P) => infer R
? (...args: P) => Proxy<R>
: Proxy<O>
class A {
m(a: boolean): any;
m(a: number): any;
m(a: string): any;
m(...a: any[]) { }
}
let p = {} as Proxy<A>;
p.m('1') // > returns Proxy<any>
p.m(1) // > returns Proxy<any>
p.m
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句