Перейти к основному содержимому

Типы объектов в TypeScript

В TypeScript есть особый синтаксис для указания типа объекта: вы перечисляете имя каждого свойства и его тип внутри фигурных скобок.

Если объекты для вас в новинку, сначала почитайте об объектах JavaScript.

Примечание: такие типы объектов можно также описать отдельно и использовать повторно — подробнее смотрите в разделе об интерфейсах.

Пример

Тип car говорит, что у объекта есть type типа string, model типа string и year типа number.

Prompt
Покажите синтаксис указания типа литерала объекта прямо на месте. Объявите константу car с типом { type: string, model: string, year: number } и присвойте ей объект с type «Toyota», model «Corolla» и year 2009. Ничего не выводится.
Вывод: программа на TypeScript и захваченный вывод

Вывод типов

TypeScript может вывести типы свойств объекта из их значений.

Пример

Тип car.type выводится как string, поэтому присвоить другую строку можно, а присвоить число — ошибка.

Prompt
Покажите, как TypeScript выводит типы свойств из литерала объекта. Создайте car только со свойством type: "Toyota", присвойте заново car.type = "Ford" (ошибки нет), затем присвойте car.type число 2 — эта строка должна завершиться ошибкой «Type 'number' is not assignable to type 'string'».
Вывод: программа на TypeScript и захваченный вывод

Необязательные свойства

Необязательные свойства — это свойства, которых может не быть при создании объекта. Отметьте их знаком ? после имени.

Без ? пропуск свойства будет ошибкой, как показано во фрагменте кода.

Пример с необязательным свойством

mileage? делает свойство необязательным, поэтому объект можно создать без него и задать значение позже.

Prompt
Покажите необязательное свойство в типе объекта. Объявите car с типом { type: string, mileage?: number }, инициализируйте его только значением type: "Toyota" (ошибки нет, потому что mileage необязательно), затем выполните car.mileage = 2000. Ничего не выводится.
Вывод: программа на TypeScript и захваченный вывод

Отсутствует обязательное свойство

Так как здесь mileage обязательно, создание car без него — ошибка: «Property 'mileage' is missing in type '{ type: string;}' but required in type '{ type: string; mileage: number; }'».

script.ts
const car: { type: string, mileage: number } = { // Error: Property 'mileage' is missing in type '{ type: string;}' but required in type '{ type: string; mileage: number; }'.
  type: "Toyota",
};
car.mileage = 2000;

Индексные сигнатуры

Индексные сигнатуры задают тип объектов, у которых нет фиксированного списка свойств. Они указывают, какого типа ключи и какого типа значения.

Примечание: такую индексную сигнатуру можно также записать с помощью служебного типа, например Record<string, number>. Подробнее — в главе о служебных типах TypeScript.

Пример

У nameAgeMap допустим любой ключ типа string, но каждое значение должно быть number, поэтому "Fifty" — ошибка.

Prompt
Покажите индексную сигнатуру для объекта с произвольными строковыми ключами и числовыми значениями. Объявите пустую константу nameAgeMap с типом { [index: string]: number }, выполните nameAgeMap.Jack = 25 (ошибки нет), затем выполните nameAgeMap.Mark = "Fifty" — эта строка должна завершиться ошибкой «Type 'string' is not assignable to type 'number'».
Вывод: программа на TypeScript и захваченный вывод