TypeScript:覆盖具有重载的方法返回类型

科斯

我正在开发一个使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

在TS游乐场中尝试此片段

可能吗

请帮我输入。谢谢!

笔记:

无需键入即可一切正常!

您可以在此处签出该库: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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有不同返回类型的方法重载

具有通用返回类型的覆盖方法

具有通用返回类型的覆盖方法,没有警告

具有不同返回类型的重载功能

具有返回类型的Typescript查找类型

使用C#库的Powershell无法识别具有不同返回类型的重载方法

PHP:重构具有不同返回类型的覆盖方法的好方法

方法覆盖期间的 TypeScript 错误:覆盖与重载

具有函数返回类型的TypeScript接口

添加泛型使您可以覆盖具有其他返回类型的方法吗?

Java泛型-覆盖抽象方法并具有子类的返回类型

如何强制子类覆盖具有更具体返回类型的继承方法

如何在具有返回类型的TypeScript方法中从Observable返回

Java中具有重载方法的类型顺序

SFINAE确定类型是否具有潜在的重载方法

具有多种返回类型的接口方法

具有返回类型的Java继承方法

具有多种返回类型的方法

方法必须具有返回类型

React Typescript-类型必须具有返回迭代器的'[Symbol.iterator]()'方法

TypeScript 构造函数重载返回不同的类型

有关具有不同返回类型的函数重载的问题

具有更具体类型声明的C#覆盖方法

具有子类作为参数类型的Scala覆盖方法

TypeScript具有相同参数的多种返回类型

为什么较少的特定重载接管了具有相同名称的更具体的覆盖方法?

c#泛型:我可以将重载方法合并为具有不同返回/输入数据类型的方法吗?

Autofixure Fixture.Customize-为什么重载具有不同的返回类型?

具有invoke_result的重载命名非成员函数的返回类型