2016-02-12 27 views
22

Diciamo che ho una classe Person che assomiglia a questo:dattiloscritto di override ToString()

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

E 'possibile eseguire l'override del metodo toString() in questa classe, così ho potuto fare qualcosa di simile a quanto segue?

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

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

Questa esclusione potrebbe essere simile a questa:

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

Edit: Questo funziona realmente. Vedi le risposte qui sotto per i dettagli.

+3

Hai provato il tuo esempio? sembra funzionare già. https://jsfiddle.net/sy8wttvw/ – Kruga

risposta

16

assoluta di stringa tipo di opere come previsto:

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) 

Che a volte può essere problema però è che non è possibile ottenere il toString di una classe genitore.

console.log("" + (<Foo>(new Bar()))); 

Verrà eseguito toString su Bar, non su Foo.

+0

Questo tipo funziona per me, ma diventa più specifico. Ho una classe ts come questo 'code' module Entidades { export class eEpisodio { public Id: numer}}' code' Se provo ad usare il mio metodo toString() aggiungendo alcune proprietà, non funziona, non sembra trovare la proprietà Id (o nessuna) –

+1

Ho aggiornato la mia risposta. Quale potrebbe essere stato il tuo problema sta definendo toString come una funzione. Definirlo come una proprietà lambda potrebbe funzionare meglio (come ho fatto nel mio nuovo esempio più esauriente). – Nypan

+0

Ha funzionato come un incantesimo, grazie! –

1

Come sottolineato da @Kruga, l'esempio sembrava funzionare in JavaScript runtime. L'unico problema con questo è che TypeScript shows a type error.

TS2345: argomento di tipo 'persona' non è cedibile a parametro di tipo 'string'.

Per risolvere questo messaggio, è necessario:

  • chiamata .toString() esplicitamente
  • o concatenare l'oggetto con una stringa (ad esempio `${obj}` o obj + '')
  • Oppure utilizzare obj as any (non raccomandato come perderai la sicurezza del tipo)
+1

"concatena l'oggetto con una stringa vuota" ha funzionato per me –