Disons que j'ai une classe Person
qui ressemble à ceci:
class Person {
constructor(
public firstName: string,
public lastName: string,
public age: number
) {}
}
Est-il possible de remplacer la méthode toString()
dans cette classe, afin que je puisse faire quelque chose comme ce qui suit?
function alertMessage(message: string) {
alert(message);
}
alertMessage(new Person('John', 'Smith', 20));
Ce remplacement pourrait ressembler à quelque chose comme ceci:
public toString(): string {
return this.firstName + ' ' + this.lastName;
}
Edit: Cela fonctionne réellement. Voir les réponses ci-dessous pour plus de détails.
Remplacer toString
fonctionne comme prévu:
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)
Ce qui peut parfois poser problème, c’est qu’il n’est pas possible d’accéder au toString
d’une classe parent:
console.log("" + (new Bar() as Foo));
Exécuteront le toString sur Bar, pas sur Foo.
Comme l'a souligné @Kruga, l'exemple semblait en réalité fonctionner en JavaScript à l'exécution. Le seul problème avec ceci est que TypeScript affiche une erreur de type .
TS2345: L'argument de type 'Personne' n'est pas assignable au paramètre de type 'chaîne'.
Pour résoudre ce message, vous devez soit:
.toString()
explicitement`${obj}`
ou obj + ''
)obj as any
_ (non recommandé car vous perdrez la sécurité de type)