2017-10-30 3 views
3

Im Folgenden stellt in Typoskript 2.5.3 fein:Typoskript: Sind berechnete Objektschlüssel aktiv erlaubt?

interface Test { 
    test: string 
} 

const anything = 'someDifferentKey'; 

const a: Test = { 
    [anything]: true, // no error 
    test: 'whatever' 
} 

Aber dies nicht:

interface Test { 
    test: string 
} 

const a: Test = { 
    someDifferentKey: true, // error 
    test: 'whatever' 
} 

Meine Frage ist - ist es 'sicher' auf berechneten Objektschlüssel verlassen immer erlaubt sein, mit einer typisierten Objektdefinition zu taggen, oder sind berechnete Eigenschaften basierend auf Konstanten vales (zB "some"+"differentKey" oder anything const referenziert oben) einfach ignoriert wegen einer Beschränkung der aktueller Typescript-Compiler?

Bearbeiten zur Klarstellung:

Lesen Sie die oben als: „Hat die TS spec mir gibt keine Garantie, dass die dynamischen Eigenschaften werden nicht immer einen Übersetzungsfehler verursachen?“ nach Juan Mendes Kommentar.

Antwort

2

The spec gibt Ihnen keine Garantie, dass es dynamische Eigenschaften nie überprüfen wird.

Wie der obige Link erklärt, überprüft TypeScript nur den statischen Teil von literalen Objekten, wenn Typen geprüft werden, nicht dynamische [Eigenschaften]. Sie dürfen sich auf dem Objekt befinden, aber Sie können es nicht ohne Casting- oder Klammernzugriff abrufen.

Ihr Code ist fast das gleiche wie wenn Sie

interface Test { 
    test: string 
} 

const anything = 'someDifferentKey'; 

const a: Test = { 
    test: 'whatever' 
} 

a[anything]: true, // no error because brackets bypass type safety 

getan hatte Das heißt, nur weil Sie eine Eigenschaft zu dem Objekt hinzugefügt, es bedeutet nicht, dass Sie es mit Typsicherheit abrufen können.

a.someDifferentKey = false; // ERROR 
// You would need 
a[anything] = false; 
+0

Ich verstehe Juan, und das macht absoluten Sinn. Aber ich beziehe mich speziell darauf, ob _bekannte_ berechnete Werte (d. H. Diejenigen, die Konstanten zugewiesen sind) immer sicher bleiben. In meinem Beispielcode ist "alles" eine Konstante, so dass es für einen statischen Typprüfer nicht zu weit entfernt erscheinen würde, um eines Tages zu erkennen, dass '[irgendwas]' nur eine Abkürzung für 'someDifferentKey' ist. Ich denke, mein Q war eher ein spekulativer Ausblick darauf, ob dies immer sicher ist, oder ob ein zukünftiger TS-Compiler eines Tages beginnen könnte, statische Werte statisch zu analysieren. –

+0

Ich glaube nicht, dass wir garantieren können, dass bei dynamischen Eigenschaften, die aus Konstanten gesetzt werden, der Compiler sie nicht als Fehler abfängt. Aber wann würdest du das jemals benutzen? Wenn es eine echte dynamische Eigenschaft ist, dann wird der Compiler das nie fangen –

+0

Ich lief heute in einen Anwendungsfall, wo ich einen dynamischen Schlüssel basierend auf Benutzereingaben anhängen musste, der wie erwartet kompiliert wurde. Aber ich merkte, dass ich nie mit Konstanten experimentiert hatte, und war überrascht, dass etwas wie "[" "" "" "] - was auch als statische Literale interpretiert werden könnte - auch kompiliert wurde, was mich neugierig machte, wie weit TS könnte bereit sein, diese Sache in Zukunft zu analysieren ... oder ob berechnete Requisiten immer tabu wären. Zugegeben, das ist eher ein Gedankenexperiment als ein Problem, auf das ich stoßen werde. –

Verwandte Themen