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

Posted

技术标签:

【中文标题】TypeScript 类方法具有与构造函数相同的重载签名【英文标题】:TypeScript class methods have same overloaded signature as constructor 【发布时间】: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;

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

【问题讨论】:

【参考方案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

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

【讨论】:

谢谢,这正是我要找的!

以上是关于TypeScript 类方法具有与构造函数相同的重载签名的主要内容,如果未能解决你的问题,请参考以下文章

为啥构造函数总是与类具有相同的名称以及它们是如何被隐式调用的?

Typescript构造函数和继承

TypeScript,面向对象,类、构造函数、继承、抽象类、接口和封装

TypeScript - 传递给构造函数整个对象

构造函数与析构函数

constructor和object的联系与对比