TypeScript überschreibt ToString() [closed]

Lesezeit: 3 Minuten

Benutzer-Avatar
Duncan Lukkenaer

Nehmen wir an, ich habe eine Klasse Person das sieht so aus:

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

Ich habe die überschrieben toString Methode wie folgt.

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

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

Benutzer-Avatar
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


Benutzer-Avatar
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.

    – Arnold Schrijver

    18. Juli 2020 um 10:10 Uhr

1137380cookie-checkTypeScript überschreibt ToString() [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy