2016-02-12 3 views
22

Скажем, у меня есть класс Person который выглядит следующим образом:машинопись переопределение ToString()

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

Можно переопределить метод toString() в этом классе, так что я мог бы сделать что-то вроде следующего?

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

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

Это переопределение может выглядеть примерно так:

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

Edit: Это на самом деле работает. Подробнее см. Ответы ниже.

+3

Вы пробовали свой собственный пример? похоже, уже работает. https://jsfiddle.net/sy8wttvw/ – Kruga

ответ

16

Переопределение нанизывать работает вроде как ожидалось:

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) 

Что иногда может быть проблемой, хотя в том, что это не возможно, чтобы получить ToString родительского класса.

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

Запустит toString на баре, а не на Foo.

+0

Этот вид работает для меня, но становится более конкретным. У меня есть класс ts, такой как этот модуль 'code' Entidades { export class eEpisodio { public Id: number}}' code' Если я пытаюсь использовать мой метод toString(), добавляющий некоторое свойство, он не работает, он похоже, не находит свойство Id (или вообще ничего) –

+1

Я обновил свой ответ. Возможно, ваша проблема заключалась в определении функции toString как функции. Определение его как свойства лямбды может работать лучше (как, например, я сделал это в моем новом, более исчерпывающем примере). – Nypan

+0

Работал как шарм, спасибо! –

1

Как отметил @Kruga, пример, по-видимому, работал во врезке JavaScript. Единственная проблема заключается в том, что TypeScript shows a type error.

TS2345: Аргумент типа «Person» не может быть назначен для параметра типа «строки».

Чтобы устранить это сообщение, вы должны либо:

  • вызов .toString() явно
  • Или сцепить объект со строкой (например, `${obj}` или obj + '')
  • Или используйте obj as any (не рекомендуется вы потеряете безопасность типа)
+1

«конкатенировать объект с пустой строкой» работал для меня –

Смежные вопросы