web-dev-qa-db-ja.com

Typescriptクラス:「オーバーロードシグネチャは関数の実装と互換性がありません」

次のクラスを作成しました。

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;
  }
}

次のエラーが発生します。

オーバーロード署名は関数の実装と互換性がありません

コンストラクタをオーバーロードするためにいくつかの方法を試しましたが、最後に試みたのは、上に投稿したものです(- here から取得)。

しかし、それでも同じエラーが発生します。私のコードの何が問題になっていますか?

17
smartmouse

実装関数のシグネチャが宣言した空のコンストラクタを満たさないため、コンパイルエラーが発生します。
デフォルトのコンストラクタが必要なので、次のようにする必要があります。

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;
    }
}

遊び場のコード

実際の実装の引数はすべてオプションであることに注意してください。これは、デフォルトのコンストラクターに引数がないためです。
このようにして、実装機能は、他の両方の署名を満たす署名を持ちます。

しかし、他の2つを宣言する必要なしに、その単一の署名を持つことができます。

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;
    }
}

遊び場のコード

2つは同等です。

24
Nitzan Tomer