Выбирай подходящую конструкцию, чтобы описывать и комбинировать объектные типы без дублирования кода.
Открыть этот урок в KodokonТы уже умеешь объявлять объектные типы. Настоящий вопрос в реальном проекте - выбрать между type и interface, а потом скомбинировать существующие типы, не дублируя код. Начнём с самого частого случая: описания сущностей, которые похожи друг на друга.
interface User {
id: number;
name: string;
}
interface Admin extends User {
permissions: string[];
}
const admin: Admin = {
id: 1,
name: "Ada",
permissions: ["users:write"],
};extends задаёт понятную связь: Admin - это User с дополнительными правами. С псевдонимом type ты получаешь тот же результат через оператор пересечения &, который объединяет несколько форм в одну. Это идеальный инструмент для сквозных свойств, например для меток времени, которые есть у всех твоих сущностей.
type Timestamps = {
createdAt: Date;
updatedAt: Date;
};
type Product = {
id: number;
label: string;
};
type StoredProduct = Product & Timestamps;Так что же выбрать? По-настоящему важны два отличия. Во-первых, только type может дать имя объединению вроде 'active' | 'archived'. Во-вторых, два объявления interface с одним и тем же именем сливаются автоматически: удобно, когда ты дополняешь типы библиотеки, и опасно, когда это происходит случайно.
type Status = "active" | "archived";
interface Config {
locale: string;
}
interface Config {
debug: boolean;
}
const config: Config = { locale: "fr", debug: true };