Typen in der Objektzerstörung

120

Dies

const { foo: IFoo[] } = bar;

und das

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

wird vernünftigerweise einen Fehler verursachen.

Und das

const { foo: TFoo } = bar;

wird nur TFooEigentum zerstören .

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

Estus Flask
quelle
Gute Frage, aber wird es nicht möglich sein, den Typ aus der Definition von bartrotzdem abzuleiten?
2
Dies wird hier recht gut behandelt .
Der Kommentar @ user663031 sollte entfernt werden, da er irreführend ist.
Sasuke Uchiha
@SasukeUchiha Der Artikel ist nicht verfügbar, aber die meisten Artikel können nach Artikeltitel gegoogelt werden. Es wurde nach mariusschulz.com/blog/… verschoben . Es wirft tatsächlich etwas Licht.
Estus Flask
Das ist hilfreich. Danke dir.
Sasuke Uchiha

Antworten:

187

Es stellt sich heraus, dass es möglich ist, den Typ nach :für das gesamte Destrukturierungsmuster anzugeben :

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

Was in Wirklichkeit nicht besser ist als einfach alt

const foo: IFoo[] = bar.foo;
artem
quelle
2
Ist {foo}aber kein Wert. Dies wird üblicherweise als "Dekonstruktionszuweisungsmuster" bezeichnet. Was Sie hier sehen, ist eine spezielle TypeScript-Funktion, mit der Typen solchen Mustern zugeordnet werden können.
In der Tat ist es eher ein Sonderfall, insbesondere im Vergleich zu let x, y, z: stringdem, für den anscheinend znur der Typ angegeben ist . Ich habe die Antwort aktualisiert.
Artem
54

Ich bin eindeutig 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 von Eigenschaften nameund agerichtig geschlossen werden sollen stringund numberjeweils.

Stephen Paul
quelle
9
Es ist ein seltener Fall, wenn Sie für jede Zerstörung eine Schnittstelle verwenden möchten.
RA.
2

Ein Follow-up zu meiner eigenen Frage.

Für Objekteigenschaften müssen keine Typen angegeben werden, da sie aus einem zerstörten Objekt abgeleitet werden.

Wenn man bedenkt, dass barrichtig geschrieben wurde, wird der fooTyp abgeleitet:

const bar = { foo: [fooValue], ... }; // bar type is { foo: IFoo[], ... }
...
const { foo } = bar; // foo type is IFoo[]

Auch wenn bares nicht richtig eingegeben wurde ( anyoder unknown), kann sein Typ bestätigt werden:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Estus Flask
quelle