【问题标题】:TypeScript class methods have same overloaded signature as constructorTypeScript 类方法具有与构造函数相同的重载签名
【发布时间】:2019-03-19 06:58:10
【问题描述】:

我正在尝试将 TypeScript 类型添加到第 3 方 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;
}

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

【问题讨论】:

    标签: typescript constructor interface overloading typescript-typings


    【解决方案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
    }
    

    但是构造函数不能合并到同一个签名中。最简单的方法就是像我做的那样简单列出来?

    【讨论】:

    • 谢谢,这正是我要找的!
    猜你喜欢
    • 2017-10-21
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多