2016-02-12 12 views
22

Sagen wir, ich habe eine Klasse Person, die wie folgt aussieht:Typoskript override ToString()

class Person { 
    constructor(
     public firstName: string, 
     public lastName: string, 
     public age: number 
    ) {} 
} 

Ist es möglich, die toString() Methode in dieser Klasse außer Kraft zu setzen, so konnte ich so etwas wie die folgenden tun?

function alertMessage(message: string) { 
    alert(message); 
} 

alertMessage(new Person('John', 'Smith', 20)); 

Diese Überschreibung könnte wie folgt aussehen:

public toString(): string { 
    return this.firstName + ' ' + this.lastName; 
} 

Edit: Das funktioniert tatsächlich. Siehe Antworten unten für Details.

+3

Haben Sie Ihr eigenes Beispiel versucht? scheint schon zu funktionieren. https://jsfiddle.net/sy8wttvw/ – Kruga

Antwort

16

bespannen Aufschalten funktioniert Art wie erwartet:

class Foo { 

    private id: number = 23423; 

    public toString =() : string => { 

     return `Foo (id: ${this.id})`; 
    } 
} 

class Bar extends Foo { 

    private name:string = "Some name"; 

    public toString =() : string => { 

     return `Bar (${this.name})`; 
    } 
} 

let a: Foo = new Foo(); 
// Calling log like this will not automatically invoke toString 
console.log(a); // outputs: Foo { id: 23423, toString: [Function] } 

// To string will be called when concatinating strings 
console.log("" + a); // outputs: Foo (id: 23423) 
console.log(`${a}`); // outputs: Foo (id: 23423) 

// and for overridden to string in subclass.. 
let b: Bar = new Bar(); 
console.log(b); // outputs: Bar { id: 23423, toString: [Function], name: 'Some name' } 
console.log("" + b); // outputs: Bar (Some name) 
console.log(`${b}`); // outputs: Bar (Some name) 

// This also works as wxpected; toString is run on Bar instance. 
let c: Foo = new Bar(); 
console.log(c); // outputs: Bar { id: 23423, toString: [Function], name: 'Some name' } 
console.log("" + c); // outputs: Bar (Some name) 
console.log(`${c}`); // outputs: Bar (Some name) 

Was manchmal Problem aber sein kann, ist, dass es nicht möglich ist, die toString von einer übergeordneten Klasse zu erhalten.

Wird die toString auf Bar, nicht auf Foo laufen.

+0

Das funktioniert irgendwie für mich, aber immer spezifischer. Ich habe eine ts-Klasse wie dieses 'code'-Modul Entidades { Exportklasse eEpisodio { public Id: numer}}' code' Wenn ich versuche, meine toString() -Methode zu verwenden, die eine Eigenschaft hinzufügt, funktioniert es nicht scheint die Id-Eigenschaft nicht zu finden (oder überhaupt) –

+1

Ich habe meine Antwort aktualisiert. Was Ihr Problem sein könnte, ist toString wie eine Funktion zu definieren. Es als Lambda-Eigenschaft zu definieren, könnte besser funktionieren (wie ich es in meinem neuen, ausführlicheren Beispiel getan habe). – Nypan

+0

Arbeitete wie ein Zauber, danke! –

1

Wie von @Kruga gezeigt, schien das Beispiel tatsächlich in Laufzeit-JavaScript zu funktionieren. Das einzige Problem dabei ist, dass TypeScript shows a type error.

TS2345: Argumente vom Typ 'Person' ist nicht zuordenbare Parameter des Typs 'string'.

Diese Nachricht zu beheben, müssen Sie entweder:

  • Anruf .toString() explizit
  • Oder das Objekt mit einer Zeichenfolge (zB `${obj}` oder obj + '')
  • Oder obj as any verwendet verketten (nicht empfohlen, da Sie werden Typ Sicherheit verlieren)
+1

"verketten das Objekt mit einer leeren Zeichenfolge" für mich gearbeitet –