Типы в деструктуризации объектов

125

это

const { foo: IFoo[] } = bar;

и это

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

разумно вызовет ошибку.

И это

const { foo: TFoo } = bar;

просто разрушит TFooсобственность.

Как можно указать типы для свойств деструктурированного объекта?

Фляга Эстуса
источник
Хороший вопрос, но разве он не сможет вывести тип из определения bar?
2
Это покрыто довольно хорошо здесь .
Комментарий @ user663031 следует удалить, так как он вводит в заблуждение.
Саске Учиха,
@SasukeUchiha Статья недоступна, но большинство статей можно найти в Google по заголовку. Он был перемещен на mariusschulz.com/blog/… . Это действительно проливает свет.
Estus Flask
Это полезно. Спасибо.
Саске Учиха

Ответы:

193

Оказывается, можно указать тип после :для всего шаблона деструктуризации:

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[]
Фляга Эстуса
источник