2016-02-12 36 views
22

Powiedzmy mam klasy Person który wygląda tak:maszynopis przesłanianie toString()

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

Czy jest możliwe aby zastąpić metodę w tej klasie toString(), więc mogłem coś zrobić jak poniżej?

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

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

Ta korekcja może wyglądać mniej więcej tak:

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

Edit: To rzeczywiście działa. Zobacz odpowiedzi poniżej, aby uzyskać szczegółowe informacje.

+3

Czy próbowałeś swojego własnego przykładu? wydaje się już działać. https://jsfiddle.net/sy8wttvw/ – Kruga

Odpowiedz

16

Zastępowanie ciąg działa niby zgodnie z oczekiwaniami:

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) 

co czasami może być problem, chociaż jest to, że nie jest możliwe, aby uzyskać toString klasy nadrzędnej.

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

Uruchomi toString na pasku, a nie na Foo.

+0

Ten rodzaj działa dla mnie, ale jest bardziej szczegółowy. Mam klasy ts takie jak ten moduł "code" Entidades { klasy eksportu eEpisodio { public Id: numer}} 'code' Jeśli spróbuję użyć mojej metody toString() dodając pewne właściwości, to nie działa, to nie wydaje się znaleźć właściwość Id (lub w ogóle) –

+1

Zaktualizowałem moją odpowiedź. To, co mogło być twoim problemem, to definiowanie toString jak funkcji. Zdefiniowanie go jako własności lambda może działać lepiej (tak jak zrobiłem to w moim nowym wyczerpującym przykładzie). – Nypan

+0

Pracowałem jak wdzięk, dzięki! –

1

Jak wskazano przez @Kruga, przykład faktycznie wydawał się działać w JavaScripcie JavaScript. Jedynym problemem jest to, że TypeScript shows a type error.

TS2345: Argument typu 'osoba' nie jest przypisane do parametru typu 'string'.

Aby rozwiązać ten komunikat, należy albo:

  • połączenia .toString() explicite
  • Albo złączyć obiekt sznurkiem (np `${obj}` lub obj + '')
  • Albo użyć obj as any (nie zalecane jako utracisz bezpieczeństwo typu)
+1

"Łączyć obiekt z pustym ciągiem" dla mnie pracował –