Jetzt erwarte ich, dass ich Folgendes tun kann, was zur Laufzeit funktioniert:
function alertMessage(message: string) {
alert(message);
}
alertMessage(new Person('John', 'Smith', 20));
Aber das gibt mir immer noch diesen Fehler:
TS2345: Argument vom Typ „Person“ kann Parameter vom Typ „Zeichenfolge“ nicht zugewiesen werden.
Wie kann ich a zuweisen Person dazu string Streit?
Haben Sie Ihr eigenes Beispiel ausprobiert? scheint schon zu funktionieren. jsfiddle.net/sy8wttvw
– Krug
12. Februar 2016 um 11:36 Uhr
Nypan
Überschreiben toString funktioniert wie erwartet:
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 expected; 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)
Was manchmal ein Problem sein kann, ist, dass es nicht möglich ist, auf die zuzugreifen toString einer Elternklasse:
console.log("" + (new Bar() as Foo));
Führt den toString auf Bar aus, nicht auf Foo.
Das funktioniert irgendwie für mich, aber immer spezifischer. Ich habe so eine TS-Klasse code module Entidades { export class eEpisodio{ public Id: numer} }code Wenn ich versuche, meine toString () -Methode zu verwenden, die eine Eigenschaft hinzufügt, funktioniert es nicht, es scheint die Id-Eigenschaft (oder überhaupt keine) zu finden.
– Mario García
12. Februar 2016 um 11:50 Uhr
Ich habe meine Antwort aktualisiert. Was Ihr Problem gewesen sein könnte, ist die Definition von toString wie eine Funktion. Es könnte besser funktionieren, es als Lambda-Eigenschaft zu definieren (wie ich es in meinem neuen, umfassenderen Beispiel getan habe).
– Nypan
12. Februar 2016 um 12:17 Uhr
@Nypan Gibt es ein Pro-Argument zu verwenden? public toString = () : string => { Anstatt von public toString(): string { ?
– Kranknr
11. Juni 2017 um 6:13 Uhr
Ja, verwenden t() : => versichert dass thiswird das sein, was Sie in der toString-Überschreibung erwarten. Sie können nachlesen Pfeilfunktionen um mehr darüber zu erfahren. Aber der grundlegende Unterschied hier ist, dass Pfeilfunktionen dies nicht selbst binden.
– Nypan
15. Juni 2017 um 10:34 Uhr
Duncan Lukkenaer
Wie von @Kruga betont, schien das Beispiel tatsächlich in Laufzeit-JavaScript zu funktionieren. Das einzige Problem dabei ist das TypeScript zeigt einen Typfehler an.
TS2345: Argument vom Typ ‘Person’ kann Parameter vom Typ ‘Zeichenfolge’ nicht zugewiesen werden.
Um diese Meldung zu beheben, müssen Sie entweder:
Anruf .toString() ausdrücklich
Oder verketten Sie das Objekt mit einer Zeichenfolge (z `${obj}` oder obj + '')
Oder verwenden obj as any (nicht empfohlen, da Sie die Typensicherheit verlieren)
“Verketten Sie das Objekt mit einer leeren Zeichenfolge” hat bei mir funktioniert
– Dan Loughney
29. September 2017 um 12:03 Uhr
In diesem Fall expliziter Aufruf an toString() scheint mir eher eine bewährte Methode zu sein, verglichen mit der “hackigeren” Verkettung mit der leeren Zeichenfolge.
Haben Sie Ihr eigenes Beispiel ausprobiert? scheint schon zu funktionieren. jsfiddle.net/sy8wttvw
– Krug
12. Februar 2016 um 11:36 Uhr