Объекты и массивы
Объекты
Inline-тип
const user: { name: string; age: number } = {
name: 'Алиса',
age: 25,
};
Через type
type User = {
name: string;
age: number;
};
const user: User = { name: 'Алиса', age: 25 };
Через interface
interface User {
name: string;
age: number;
}
const user: User = { name: 'Алиса', age: 25 };
Опциональные свойства
type User = {
name: string;
age?: number;
};
const user: User = { name: 'Алиса' }; // ок
Знак ? — свойство может отсутствовать.
Readonly
type User = {
readonly id: number;
name: string;
};
const user: User = { id: 1, name: 'Алиса' };
user.id = 2; // ошибка
Вложенные объекты
type User = {
name: string;
address: {
city: string;
zip: string;
};
};
Или через отдельный тип:
type Address = {
city: string;
zip: string;
};
type User = {
name: string;
address: Address;
};
Индексные сигнатуры
Если структура объекта заранее неизвестна:
type Dictionary = {
[key: string]: number;
};
const scores: Dictionary = { math: 90, physics: 85 };
Record
Утилита для словарей:
type Scores = Record<string, number>;
type Roles = Record<'admin' | 'user', string>;
Массивы
Простой массив
const numbers: number[] = [1, 2, 3];
const names: string[] = ['Алиса', 'Боб'];
Array<T>
const numbers: Array<number> = [1, 2, 3];
Оба варианта эквивалентны.
Массив объектов
type User = { name: string; age: number };
const users: User[] = [
{ name: 'Алиса', age: 25 },
{ name: 'Боб', age: 30 },
];
Пустой массив
const items: string[] = [];
items.push('a');
Без аннотации TypeScript выведет never[].
Кортежи
Кортеж — массив фиксированной длины с известными типами по позициям:
let point: [number, number] = [10, 20];
let entry: [string, number] = ['age', 25];
Порядок и типы важны:
point = [10, 20]; // ок
point = [20, 10]; // ок
point = ['a', 'b']; // ошибка
point = [1, 2, 3]; // ошибка
С опциональными элементами:
type Pair = [string, number?];
const p1: Pair = ['a'];
const p2: Pair = ['a', 1];
ReadonlyArray
const numbers: readonly number[] = [1, 2, 3];
numbers.push(4); // ошибка
Деструктуризация
const user = { name: 'Алиса', age: 25 };
const { name, age } = user;
const [first, second] = [1, 2, 3];
Итоги
- Объекты описываются через
typeилиinterface ?— опциональное свойствоreadonly— только для чтенияRecord<K, V>— словарь- Массивы:
T[]илиArray<T> - Кортежи — фиксированная длина и типы
readonly T[]— неизменяемый массив