Digamos que tengo una clase Person que se parece a esto:

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

Es posible reemplazar la toString() método de esta clase, así que yo podría hacer algo como lo siguiente?

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

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

Este reemplazo podría ser algo como esto:

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

Edit: Esto realmente funciona. Ver las respuestas abajo para más detalles.

InformationsquelleAutor Duncan Luk | 2016-02-12

2 Comentarios

  1. 33

    Primordial toString obras tipo, como se esperaba:

    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 concatenating strings
    console.log("" + a); //outputs: Foo (id: 23423)
    console.log(`${a}`); //outputs: Foo (id: 23423)
    
    //and for overridden toString 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)

    Lo que a veces puede ser un problema si es que no es posible acceder a la toString de una clase padre:

    console.log("" + (new Bar() as Foo));

    Se ejecutará el método toString en la Barra, no en Foo.

    • Que algo que funciona para mí, pero siendo más específico. Tengo un ts de clase como esta code módulo de Entidades { exportar clase eEpisodio{ public Id: numer} }code Si intento utilizar mi método toString() la adición de algunos bienes, no funciona, no parece encontrar el Id de la propiedad (o ninguna en absoluto)
    • He actualizado mi respuesta. Lo que podría haber sido su problema es la definición de los toString como una función. La define como una lambda de la propiedad podría funcionar mejor (al igual que he hecho en mi nuevo más exhaustiva ejemplo).
    • Trabajó como un encanto, gracias!
    • Hay un argumento a favor de utilizar public toString = () : string => { en lugar de public toString(): string { ?
    • Sí, a través de t() : => asegura que thisserá lo que usted espera en el método toString de sobrepaso. Usted puede leer sobre funciones para saber más acerca de esto. Pero la diferencia básica aquí es que la flecha funciones no se unen a su propio presente.
  2. 6

    Como se ha señalado por @Kruga, el ejemplo realmente parecía funcionar en tiempo de ejecución de JavaScript. El único problema con esto es que Manuscrito muestra un error de tipo.

    TS2345: Argumento de tipo ‘Persona’ no es asignable al parámetro de tipo ‘string’.

    Para resolver este mensaje, usted debe:

    • Llamada .toString() explícitamente
    • O concatenar el objeto con una cadena (por ejemplo, `${obj}` o obj + '')
    • O uso obj as any (no se recomienda como usted perderá el tipo de seguridad)
    • «concatenar el objeto con una cadena vacía» que funcionó para mí

Dejar respuesta

Please enter your comment!
Please enter your name here