Типи деструктурування об'єктів


122

Це

const { foo: IFoo[] } = bar;

і це

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

розумно викличе помилку.

І це

const { foo: TFoo } = bar;

просто знищить TFooмайно.

Як можна вказати типи деструктованих властивостей об'єкта?


Хороше запитання, але чи не вдасться це зробити висновок про тип із визначення bar?

2
Це покрито досить добре тут .

Коментар @ user663031 слід видалити, оскільки він вводить в оману.
Саске Учіха

@SasukeUchiha Стаття недоступна, але більшість статей може бути гугл за заголовком статті. Він був переміщений на mariusschulz.com/blog/… . Він справді проливає трохи світла.
колба Естуса

Це корисно. Дякую.
Саске Учіха

Відповіді:


189

Виявляється, можна вказати тип після :для всієї структури руйнування:

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

Що насправді не краще, ніж звичайне старе

const foo: IFoo[] = bar.foo;

2
Але {foo}це не цінність. Це те, що зазвичай називають "схемою деконструкції призначення". Те, що ви бачите тут, насправді є спеціальною функцією TypeScript, яка дозволяє асоціювати типи з такими шаблонами.

Дійсно, це більше схоже на окремий випадок, особливо порівняно з ним, let x, y, z: stringмабуть, визначає zлише тип . Я оновив відповідь.
артем

55

Я, очевидно, трохи спізнився на вечірку, але:

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

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

Типи властивостей nameі ageповинні бути правильно виведені на stringі numberвідповідно.


9
Це рідкісний випадок, коли ви хочете використовувати інтерфейс для кожного знищення.
РА.

2

Подальше моє запитання.

Типи не потрібно вказувати для властивостей об'єкта, оскільки вони виведені з деструктурованого об'єкта.

Зважаючи на те, що barбуло правильно введено, fooтип буде зроблений:

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

Навіть якщо barнеправильно було набрано ( anyабо unknown), його тип можна стверджувати:

const { foo } = bar as { foo: IFoo[] }; // foo type is IFoo[]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.