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


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[]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.