TypeScript类方法具有与构造函数相同的重载签名

时间:2018-10-14 20:16:40

标签: typescript constructor interface overloading typescript-typings

我正在尝试将TypeScript类型添加到第三方JavaScript库中。大多数类方法都采用同一类的另一个实例并返回一个新实例,但是它们也将接受相同的重载构造函数参数来代替该类的实际实例。我试图避免为类的许多方法中的每个方法编写相同的重载签名,但是我不确定如何在我的.d.ts文件中执行此操作。

例如,我可以像这样写出每个人……

class Foo {
  constructor(x: number);
  constructor(x: number, y: number);
  constructor({ x: number, y: number });

  Fizz(foo: Foo): Foo;
  Fizz(x: number): Foo;
  Fizz(x: number, y: number): Foo;
  Fizz({ x: number, y: number }): Foo;

  Buzz(foo: Foo): Foo;
  Buzz(x: number): Foo;
  Buzz(x: number, y: number): Foo;
  Buzz({ x: number, y: number }): Foo;

  // etc... for several methods
}

但是最好做类似...

class Foo {
  constructor(x: number);
  constructor(x: number, y: number);
  constructor({ x: number, y: number });

  // I'd like some sort of syntax like...
  Fizz(constructor()): Foo;
  Buzz(constructor()): Foo;
}

我可以轻松地声明和重用重载的方法签名吗?

1 个答案:

答案 0 :(得分:1)

您可以很容易地合并成员函数的签名:

// Consolidate the signatures
type CreatesFoo = {
    (foo: Foo): Foo;    
    (x: number): Foo;
    (x: number, y: number): Foo;
    (obj: { x: number, y: number }): Foo;
}

class Foo {
  constructor(x: number);
  constructor(x: number, y: number);
  constructor(obj: { x: number, y: number });
  constructor(...args:any[]) {}


  Fizz: CreatesFoo = (): any => {
  }

  Buzz: CreatesFoo= (): any => {
  }

  // etc... for several methods
}

但是,构造函数无法合并到相同的签名中。最简单的方法就是像我一样将其列出