javascript - convert - react number to string
OverScript de TypeScript ToString() (2)
Anulando a trabajos de cuerdas como se espera:
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)
Sin embargo, lo que a veces puede ser un problema es que no es posible obtener el toString de una clase padre.
console.log("" + (<Foo>(new Bar())));
Ejecutará el toString en Bar, no en Foo.
Digamos que tengo una Person
clase que se parece a esto:
class Person {
constructor(
public firstName: string,
public lastName: string,
public age: number
) {}
}
¿Es posible anular el método toString()
en esta clase, por lo que podría hacer algo como lo siguiente?
function alertMessage(message: string) {
alert(message);
}
alertMessage(new Person(''John'', ''Smith'', 20));
Esta anulación podría tener este aspecto:
public toString(): string {
return this.firstName + '' '' + this.lastName;
}
Edición: Esto realmente funciona. Vea las respuestas a continuación para más detalles.
Como lo señaló @Kruga, el ejemplo parecía funcionar en JavaScript en tiempo de ejecución. El único problema con esto es que TypeScript muestra un error de tipo .
TS2345: El argumento de tipo ''Persona'' no se puede asignar al parámetro de tipo ''cadena''.
Para resolver este mensaje, debe:
- Llama a
.toString()
explícitamente - O concatene el objeto con una cadena (por ejemplo,
`${obj}`
uobj + ''''
) - O use
obj as any
(no recomendado, ya que perderá la seguridad del tipo)