2016-10-10 7 views
1

Wie kann ich auf die Eigenschaften eines Objekts verweisen, wo die Schlüssel eine beliebige Zeichenfolge sein können?Siehe einen Schlüssel mit Punktnotation, Typ ist {[x: string]: string}

Ich würde den Compiler erwarten keinen Fehler in der letzten Zeile zu werfen:

export type apple = { [x: string]: string } 

export type pie = { 
    fruit: apple; 
} 

let myPie: pie = { 
    fruit: { 
    appleVariety: 'Granny Smith' 
    } 
} 

console.log(myPie.fruit.appleVariety); 
+2

Sie können auf 'any' Stimmen: ' ( myPie.fruit) .appleVariety', aber Sie verlieren jede intellisense diese Weise –

Antwort

2

Sie entweder eine Wende Objekt wie Sie verwenden:

type apple = { [x: string]: string }; 
let a: apple = { appleVariety: 'Granny Smith' } 
let variety = a['appleVariety']; 
let something = a['something']; // no error even though it's undefined 

Oder geben Sie die Eigenschaften in das Objekt:

type apple = { appleVariety: string }; 
let a: apple = { appleVariety: 'Granny Smith' } 
let variety = a.appleVariety; 
let something = a.something; // Error: Property 'something' does not exist on type '{ appleVariety: string; }'. 

Sie können die beiden nicht mischen.
Die Philosophie hinter diesem ist, dass, wenn Sie die Eigenschaftsnamen kennen, diese dann explizit in Ihre Schnittstellen-/Typdefinition einschließen.
Wenn Sie jedoch nur eine Auflistung von Eigenschaften in einem Objekt haben, sucht der Compiler nicht nach dem verwendeten Eigenschaftsnamen, sondern nur nach dem Typ.

+0

Danke für die knappe Antwort, die es aufräumt. Es ist ein guter Punkt: Wenn ich den Namen einer Eigenschaft kenne, auf die ich mich beziehe, sollte es in der Definition auch sein. – craigsnyders

Verwandte Themen