Typescript类:"重载签名与函数实现不兼容"

sma*_*use 17 constructor class constructor-overloading typescript angular

我创建了以下类:

export class MyItem {
  public name: string;
  public surname: string;
  public category: string;
  public address: string;

  constructor();
  constructor(name:string, surname: string, category: string, address?: string);
  constructor(name:string, surname: string, category: string, address?: string) {
    this.name = name;
    this.surname = surname;
    this.category = category;
    this.address = address;
  }
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

过载签名与功能实现不兼容

我尝试了几种方法来重载构造函数,我尝试的最后一个是我在上面发布的(我从这里得到).

但我仍然得到同样的错误.我的代码出了什么问题?

Nit*_*mer 23

您得到该编译错误,因为实现函数的签名不满足您声明的空构造函数.
由于你想拥有默认的构造函数,它应该是:

class MyItem {
    public name: string;
    public surname: string;
    public category: string;
    public address: string;

    constructor();
    constructor(name:string, surname: string, category: string, address?: string);
    constructor(name?: string, surname?: string, category?: string, address?: string) {
        this.name = name;
        this.surname = surname;
        this.category = category;
        this.address = address;
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

请注意,实际实现中的所有参数都是可选的,因为默认构造函数没有参数.
这样,实现功能具有满足其他签名的签名.

但是你可以拥有那个单一的签名,而不需要声明另外两个:

class MyItem {
    public name: string;
    public surname: string;
    public category: string;
    public address: string;

    constructor(name?: string, surname?: string, category?: string, address?: string) {
        this.name = name;
        this.surname = surname;
        this.category = category;
        this.address = address;
    }
}
Run Code Online (Sandbox Code Playgroud)

(游乐场代码)

两者是等价的.