Урок 05

Объекты и массивы

Объекты

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[] — неизменяемый массив