23

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

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

次のエラーが表示されます。

オーバーロード シグネチャは関数の実装と互換性がありません

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

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

4

1 に答える 1

42

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

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 つを宣言する必要がなく、その 1 つの署名だけを持つことができます。

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つは同等です。

于 2016-09-09T08:52:27.880 に答える