/ / Javascript, das syntaktisch ungültig ist Typoskript - Typoskript

Javascript, das syntaktisch ungültig ist Typoskript - Typoskript

Ich finde es etwas nervig, dass einige normale JavaScript-Funktionen in Typoskripten nicht syntaktisch korrekt sind.

Insbesondere das Hinzufügen von Eigenschaften zu leeren Objekten, wie in diesem Beispiel, ist nicht möglich, da Typescript annimmt, dass das leere Objekt vom Typ "{}" ohne Eigenschaften ist.

var a = {};

a.property = 1; // Error

Um dies zu lösen, muss ich das leere Objekt als einen indexierbaren Typ definieren.

var b: { [x:string] : any} = {};

b.property = 1;

Gibt es eine Problemumgehung?

Antworten:

3 für die Antwort № 1

Syntaktisch ist der Code semantisch korrektes ist falsch. Sie können das Javascript auch mit diesem Fehler noch ausgeben, und Typoskript tut das standardmäßig, wenn Sie nur semantische Fehler haben (nicht passende Typen, zusätzliche Eigenschaften usw.)

Typescript prüft, ob Sie mit den Typen übereinstimmen, die Sie einem Objekt zuweisen, und der Typ wird bei der ersten Zuweisung festgelegt.

Sie können eines von mehreren Dingen tun, eines von Ihnen, das Sie bereits entdeckt haben, und Sie können eine beliebige Eigenschaft für das Objekt festlegen:

var b: { [x:string] : any} = {};

Sie können die Eigenschaften, die Teil des Objekts sind, explizit deklarieren, wenn der Eigenschaftensatz bekannt ist:

var b: { property?: string } = {};

Oder wenn Sie sich überhaupt nicht mit Typen beschäftigen wollen, die Sie verwenden könnten any:

var b: any = {};

Der letzte ist nicht wirklich zu empfehlenauf alle Typprüfungen verzichten. Der zweite ist der beste, Sie beschränken alle Eigenschaften auf ihre korrekten Typen und Sie stellen sicher, dass dem Objekt nichts hinzugefügt wird. Die erste ist gut, wenn die Eigenschaften des Objekts zur Laufzeit nicht bekannt sind.

Wenn Sie den gleichen Typ mehrmals verwenden, können Sie eine Schnittstelle verwenden:

interface TypeOfB { property?: string }
var b: TypeOfB = {}

0 für die Antwort № 2

Du könntest benutzen

var a = {};

a["property"] = 1;

Damit ist es sowohl für TS als auch für JS korrekt