【发布时间】:2021-01-27 07:15:46
【问题描述】:
我正在开发一个用于制作 Rx Observables 代理的开源库。
(为简单起见,我将使用Box<A> 而不是Observable<A>)
它接受一个Box<A> 并返回一个类型{ [P in keyof A]: Box<A[P]> }。
有一个细微差别:这种新类型的所有方法也应该返回该方法结果的Box,同时保留它的参数类型。所以:
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
Try this snippet in TS playground
有可能吗?
请帮我打字。谢谢!
注意事项:
没有打字就一切正常!
您可以在此处查看库:rxjs-proxify(src/proxify.ts 中定义的类型)
【问题讨论】:
标签: typescript types type-conversion