📘 TypeScript

Интерфейсы и псевдонимы типов TypeScript

Определение интерфейса

interface User {
    id: number;
    name: string;
    email: string;
}

const user: User = {
    id: 1,
    name: "Алиса",
    email: "alice@example.com"
};

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

interface Product {
    readonly id: number;     // нельзя изменить после создания
    name: string;
    price: number;
    description?: string;    // необязательное
}

const laptop: Product = {
    id: 101,
    name: "Ноутбук Pro",
    price: 89999
};
// laptop.id = 200;  // ❌ Ошибка: readonly

Расширение интерфейсов

interface Animal {
    name: string;
    age: number;
}

interface Dog extends Animal {
    breed: string;
    bark(): void;
}

const rex: Dog = {
    name: "Рекс",
    age: 3,
    breed: "Лабрадор",
    bark() { console.log("Гав!"); }
};

Интерфейс vs псевдоним типа

// interface — расширяемый, слияние объявлений
interface Point { x: number; y: number; }
interface Point { z?: number; }  // объединяются!

// type alias — мощнее, поддерживает объединения
type Shape = Circle | Rectangle;
type Circle = { kind: "circle"; radius: number };
type Rectangle = { kind: "rect"; w: number; h: number };

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

interface StringMap {
    [key: string]: string;
}

const config: StringMap = {
    host: "localhost",
    port: "5432",
    db: "myapp"
};