web-dev-qa-db-fra.com

Classe dactylographiée: "La signature de surcharge n'est pas compatible avec l'implémentation de la fonction"

J'ai créé la classe suivante:

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

J'obtiens l'erreur suivante:

La signature de surcharge n'est pas compatible avec la mise en œuvre de la fonction

J'ai essayé plusieurs façons de surcharger le constructeur, la dernière que j'ai essayée est que j'ai posté ci-dessus (que j'obtiens de ici ).

Mais je reçois toujours la même erreur. Qu'est ce qui ne va pas avec mon code?

17
smartmouse

Vous obtenez cette erreur de compilation car la signature de la fonction d'implémentation ne satisfait pas le constructeur vide que vous avez déclaré.
Comme vous voulez avoir le constructeur par défaut, il devrait être:

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

( code dans l'aire de jeux )

Notez que tous les arguments dans l'implémentation réelle sont facultatifs et c'est parce que le constructeur par défaut n'a pas d'arguments.
De cette façon, la fonction d'implémentation a une signature qui satisfait les deux autres signatures.

Mais vous pouvez alors simplement avoir cette signature unique sans avoir besoin de déclarer les deux autres:

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

( code dans l'aire de jeux )

Les deux sont équivalents.

24
Nitzan Tomer