2016-09-24 6 views
5

DieseTypen in Objekt Destrukturierung

const { foo: IFoo[] } = bar; 

und diese

const { foo: Array<IFoo> } = bar; 

wird vernünftigerweise einen Fehler verursachen.

Und das

const { foo: TFoo } = bar; 

wird denaturiert, nur TFoo Eigenschaft.

Wie können Typen für destrukturierte Objekteigenschaften angegeben werden?

+0

Gute Frage, aber ist es nicht in der Lage, den Typ aus der Definition von 'bar' abzuleiten? –

+0

Das ist [hier] ziemlich gut abgedeckt (https://blog.mariusschulz.com/2015/11/13/typing-destructured-object-parameters-in-typescript). –

+0

@torazaburo Danke, es sieht so aus, als ob die einzige Syntax die ist, die in der Antwort ist. 'bar' kommt von außen und ist locker typisiert, daher möchte ich nur die erforderlichen Eigenschaften eingeben. – estus

Antwort

7

Es stellt sich heraus, es ist möglich, die Art nach : für die ganze Destrukturierung Muster zu spezifizieren:

const {foo}: {foo: IFoo[]} = bar; 

in Wirklichkeit, die nicht besser als plain old

const foo: IFoo[] = bar.foo; 
+0

Aber '{foo}' ist kein Wert. Dies wird üblicherweise als "dekonstruierendes Zuweisungsmuster" bezeichnet. Was Sie hier sehen, ist eigentlich ein spezielles TypeScript-Feature, das die Zuordnung von Typen zu solchen Mustern ermöglicht. –

+0

In der Tat ist es eher ein Sonderfall, insbesondere im Vergleich zu "let x, y, z: string", der scheinbar nur den Typ für 'z' angibt. Ich habe die Antwort aktualisiert. – artem

5

Ich bin eindeutig ist etwas spät zur Party, aber:

interface User { 
    name: string; 
    age: number; 
} 

const obj: any = {name: 'Johnny', age: 25}; 
const {name, age}: User = obj; 

Die Arten der Eigenschaften name und age sollten korrekt auf string bzw. number gefolgert werden.

Verwandte Themen