2017-12-17 2 views
1

ich dieses Stück Code in TS Spielplatz versucht und kam in dieser seltsamen Sacheneue Eigenschaft kann nicht in abgeleiteten Klasse Konstruktor instanziiert wird

class Animal { 
    constructor(public name: string) { 
     this.name = name; 
    } 
} 

    class Snake extends Animal { 
     constructor(name: string, isPoisonous: boolean) { 
      super(name); 
      this.isPoisonous= isPoisonous; 
     } 
    } 

Sobald ich die isPoisonous Eigenschaft in Snake Konstruktor eingeführt TS brüllt Ich sage 'Property 'isPoisonous' does not exist on type 'Snake''. Interessanterweise ist das Gleiche in ES6 in Ordnung.

+2

Sie verpassen die Zugriffsebene, die 'isPoisonous' einen Parameter Eigenschaft machen würde, oder die separate Definition der Eigenschaft, die es Ihnen erlauben würde, es wegzulassen. – jonrsharpe

+0

@jonrsharpe Punkt! Bedeutet das, dass TS einen Zugriffsspezifizierer benötigt, während er eine Prop in ctor instanziiert, ohne sie zu deklarieren? – izengod

+0

Es braucht eine Definition, um die Zuweisung zu erlauben, entweder eine Parametereigenschaft (in diesem Fall ist die direkte Zuweisung sowieso redundant; Ihr Animal-Konstruktor hat eine sinnlose Zeile) oder die reguläre Art. – jonrsharpe

Antwort

0

Sie müssen die Zugriffsebene (dh public) festlegen, um etwas als eine Klassenvariable im Gegensatz zu nur einem Parameter für den Konstruktor festzulegen. Also, public vor dem Wert hinzufügen würde Ihr Problem lösen.

Das heißt, als eine Frage des Stils, ist es wahrscheinlich besser ist, diese Eigenschaften zu zukunfts erklären:

class Animal { 
    public name : string; 

    constructor(public name: string) { 
    this.name = name; 
    } 
} 

class Snake extends Animal { 
    public isPoisonous : boolean; 

    constructor(name: string, isPoisonous: boolean) { 
    super(name); 
    this.isPoisonous = isPoisonous; 
    } 
} 
+0

Nun, in der Tierklasse braucht es keine Deklaration für den Namen (versuchen Sie das zu entfernen). Sollte für die Snake-Klasse auch nicht anders sein. – izengod

+0

@ izengod, weil Sie "öffentlich" vor der Eigenschaft vermissen. Es wird als Parameter und nicht als Variable interpretiert. –

+0

ahh Gotcha! Ich habe immer noch einige Zweideutigkeiten beim Vergleich mit ES6-Eigenschaften. Konstruktoren einer Klasse in ES6 sind grundsätzlich eine Alternative zu älteren Funktionskonstruktoren in Javascript, die in ähnlichen Situationen wie die Frage gut mit der Prototypkette funktionieren. Was mich stört ist, wie die Einführung der statischen Typisierung in TS das Szenario verändert. Jeder Artikel oder jede Erklärung wäre großartig. – izengod

Verwandte Themen