2016-06-22 19 views
5

Ich versuche, eine Klasse in TypeScript zu erweitern. Ich erhalte diesen Fehler beim Kompilieren: 'Mitgelieferte Parameter stimmen mit keiner Signatur des Anrufziels überein.' Ich habe versucht, die Eigenschaft artist.name im Superaufruf als Super (Name) zu referenzieren, funktioniert aber nicht.Verwenden von TypeScript super()

Alle Ideen und Erklärungen, die Sie haben, werden sehr geschätzt. Danke - Alex.

class Artist { 
    constructor(
    public name: string, 
    public age: number, 
    public style: string, 
    public location: string 
){ 
    console.log(`instantiated ${name}, whom is ${age} old, from ${location}, and heavily regarded in the ${style} community`); 
    } 
} 

class StreetArtist extends Artist { 
    constructor(
    public medium: string, 
    public famous: boolean, 
    public arrested: boolean, 
    public art: Artist 
){ 
    super(); 
    console.log(`instantiated ${this.name}. Are they famous? ${famous}. Are they locked up? ${arrested}`); 
    } 
} 

interface Human { 
    name: string, 
    age: number 
} 

function getArtist(artist: Human){ 
    console.log(artist.name) 
} 

let Banksy = new Artist(
    "Banksy", 
    40, 
    "Politcal Graffitti", 
    "England/Wolrd" 
) 

getArtist(Banksy); 
+0

** Lösung: Bitte lesen Sie @mollwes Antwort unten. –

Antwort

6

Der Superaufruf muss alle Parameter für die Basisklasse liefern. Der Konstruktor wird nicht geerbt. Kommentierte Künstler, weil ich denke, dass es nicht benötigt wird, wenn man so vorgeht.

class StreetArtist extends Artist { 
    constructor(
    name: string, 
    age: number, 
    style: string, 
    location: string, 
    public medium: string, 
    public famous: boolean, 
    public arrested: boolean, 
    /*public art: Artist*/ 
){ 
    super(name, age, style, location); 
    console.log(`instantiated ${this.name}. Are they famous? ${famous}. Are they locked up? ${arrested}`); 
    } 
} 

Oder wenn Sie die Kunst Parameter bestimmt Basiseigenschaften zu füllen, aber in diesem Fall, dass ich denke, es gibt für die Verwendung von öffentlichen auf Kunst Parameter nicht wirklich notwendig ist, da die Eigenschaften vererbt werden würde und es würde nur speichern Duplikat Daten.

class StreetArtist extends Artist { 
    constructor(
    public medium: string, 
    public famous: boolean, 
    public arrested: boolean, 
    /*public */art: Artist 
){ 
    super(art.name, art.age, art.style, art.location); 
    console.log(`instantiated ${this.name}. Are they famous? ${famous}. Are they locked up? ${arrested}`); 
    } 
} 
+0

Wenn Sie jedem der Konstruktorargumente pubic hinzufügen, wird dieses Argument sowohl dem Kind als auch dem Elternknoten –

+0

zugewiesen. Ich wollte die Basisklasse mit art: Artist füllen. Die zweite Lösung funktionierte nahtlos. Vielen Dank. –

+0

Glücklich, um zu helfen. @mortezaT Sie haben Recht, es bedeutete, die ersten vier Argumente ohne Öffentlichkeit zu haben. Ich weiß nicht, was passieren wird, wenn Sie StreetArtist an Artist und den Access-Namen zum Beispiel eingeben, werden sie gleich sein? Es verbirgt Grundeigentum richtig? – mollwe

Verwandte Themen