Types de déstructuration d'objets

124

Ce

const { foo: IFoo[] } = bar;

et ça

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

causera raisonnablement une erreur.

Et ça

const { foo: TFoo } = bar;

va juste détruire la TFoopropriété.

Comment les types peuvent-ils être spécifiés pour les propriétés d'objets déstructurés?

Fiole d'Estus
la source
Bonne question, mais ne sera-t-il pas en mesure de déduire le type de la définition de de bartoute façon?
2
Ceci est assez bien couvert ici .
Le commentaire @ user663031 doit être supprimé car il est trompeur.
Sasuke Uchiha le
@SasukeUchiha L'article n'est pas disponible, mais la plupart des articles peuvent être recherchés sur Google par titre d'article. Il a été déplacé sur mariusschulz.com/blog/… . Cela jette un peu de lumière en effet.
Estus Flask
Cela est utile. Je vous remercie.
Sasuke Uchiha le

Réponses:

192

Il s'avère qu'il est possible de spécifier le type après :pour tout le modèle de déstructuration:

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

Ce qui en réalité n'est pas meilleur qu'un simple vieux

const foo: IFoo[] = bar.foo;
artem
la source
2
Mais ce {foo}n'est pas une valeur. C'est ce que l'on appelle généralement un «schéma d'affectation déconstructif». Ce que vous voyez ici est en fait une fonction spéciale de TypeScript qui permet d'associer des types à de tels modèles.
En effet, cela ressemble plus à un cas particulier, surtout par rapport à celui let x, y, z: stringqui spécifie apparemment le type pour zseulement. J'ai mis à jour la réponse.
artem
55

Je suis clairement un peu en retard à la fête, mais:

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

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

Les types de propriétés nameet agedoivent être correctement déduits de stringet numberrespectivement.

Stephen Paul
la source
9
C'est un cas rare où vous souhaitez utiliser une interface pour chaque destruction.
RA.
2

Une suite à ma propre question.

Les types n'ont pas besoin d'être spécifiés pour les propriétés d'objet car ils sont déduits d'un objet déstructuré.

Considérant qu'il a barété tapé correctement, le footype sera déduit:

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

Même s'il barn'a pas été correctement tapé ( anyou unknown), son type peut être affirmé:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Fiole d'Estus
la source