Типы объектов в TypeScript
В TypeScript есть особый синтаксис для указания типа объекта: вы перечисляете имя каждого свойства и его тип внутри фигурных скобок.
Если объекты для вас в новинку, сначала почитайте об объектах JavaScript.
Примечание: такие типы объектов можно также описать отдельно и использовать повторно — подробнее смотрите в разделе об интерфейсах.
Пример
Тип car говорит, что у объекта есть type типа string, model типа string и year типа number.
car с типом { type: string, model: string, year: number } и присвойте ей объект с type «Toyota», model «Corolla» и year 2009. Ничего не выводится.
Вывод: программа на TypeScript и захваченный вывод
const car: { type: string, model: string, year: number } = {
type: "Toyota",
model: "Corolla",
year: 2009
};
Вывод типов
TypeScript может вывести типы свойств объекта из их значений.
Пример
Тип car.type выводится как string, поэтому присвоить другую строку можно, а присвоить число — ошибка.
car только со свойством type: "Toyota", присвойте заново car.type = "Ford" (ошибки нет), затем присвойте car.type число 2 — эта строка должна завершиться ошибкой «Type 'number' is not assignable to type 'string'».
Вывод: программа на TypeScript и захваченный вывод
const car = {
type: "Toyota",
};
car.type = "Ford"; // ошибки нет
car.type = 2; // Ошибка: Type 'number' is not assignable to type 'string'.
Необязательные свойства
Необязательные свойства — это свойства, которых может не быть при создании объекта. Отметьте их знаком ? после имени.
Без ? пропуск свойства будет ошибкой, как показано во фрагменте кода.
Пример с необязательным свойством
mileage? делает свойство необязательным, поэтому объект можно создать без него и задать значение позже.
car с типом { type: string, mileage?: number }, инициализируйте его только значением type: "Toyota" (ошибки нет, потому что mileage необязательно), затем выполните car.mileage = 2000. Ничего не выводится.
Вывод: программа на TypeScript и захваченный вывод
const car: { type: string, mileage?: number } = { // ошибки нет
type: "Toyota"
};
car.mileage = 2000;
Отсутствует обязательное свойство
Так как здесь mileage обязательно, создание car без него — ошибка: «Property 'mileage' is missing in type '{ type: string;}' but required in type '{ type: string; mileage: number; }'».
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" — ошибка.
nameAgeMap с типом { [index: string]: number }, выполните nameAgeMap.Jack = 25 (ошибки нет), затем выполните nameAgeMap.Mark = "Fifty" — эта строка должна завершиться ошибкой «Type 'string' is not assignable to type 'number'».
Вывод: программа на TypeScript и захваченный вывод
const nameAgeMap: { [index: string]: number } = {};
nameAgeMap.Jack = 25; // ошибки нет
nameAgeMap.Mark = "Fifty"; // Ошибка: Type 'string' is not assignable to type 'number'.