Ответ
И type, и interface используются для описания форм объектов, но имеют ключевые различия в возможностях и сценариях использования.
interface:
- Основная цель: Описание формы объекта, особенно в контексте ООП и контрактов.
- Расширение: Использует ключевое слово
extends.interface User { name: string; } interface Admin extends User { permissions: string[]; } - Объявление слияния (Declaration Merging): Интерфейсы с одним именем автоматически объединяются. Это полезно для расширения типов из сторонних библиотек.
interface Window { title: string; } interface Window { ts: TypeScriptAPI; } // Результат: Window { title: string; ts: TypeScriptAPI; } - Имплементация: Классы могут реализовывать (
implements) интерфейсы.
type (псевдоним типа):
- Основная цель: Создание псевдонима для любого типа, включая примитивы, объединения, пересечения и кортежи.
- Расширение: Использует пересечение (
&).type User = { name: string }; type Admin = User & { permissions: string[] }; - Продвинутые типы: Может определять типы, которые невозможно выразить через
interface.// Union тип type Status = 'success' | 'error' | 'pending'; // Tuple тип type Point = [number, number]; // Mapped Types type Readonly<T> = { readonly [P in keyof T]: T[P] };
Что использовать?
- Используйте
interface, когда:- Работаете с объектами/классами в стиле ООП.
- Вам может понадобиться объявление слияния (например, при написании деклараций).
- Используйте
type, когда:- Нужен union, intersection, mapped type или кортеж.
- Определяете псевдоним для примитива.
На практике для описания объектов разница часто несущественна, и выбор может быть делом вкуса, но понимание этих различий важно для сложных сценариев.
Ответ 18+ 🔞
Слушай, а вот эта вечная тема про type и interface — это же классический спор, как «на чём лучше жарить яичницу: на сковородке или на тарелке?». Вроде и то, и то сработает, но нюансы, блядь, есть овердохуища.
Вот смотри, interface — это такой этакий формалист, любитель контрактов. Его главная фишка — описать, как должен выглядеть объект, особенно если ты в ООП ударился. Хочешь его расширить? Пожалуйста, ключевое слово extends к твоим услугам.
interface User {
name: string;
}
interface Admin extends User {
permissions: string[];
}
А ещё у него есть суперсила — объявление слияния. Это когда ты можешь объявить Window в одном месте, потом в другом файле добавить к нему поля, и они склеятся в одну кучу. Для библиотек — просто находка, ёпта.
interface Window {
title: string;
}
interface Window {
ts: TypeScriptAPI;
}
// Итог: Window { title: string; ts: TypeScriptAPI; } — всё в одном флаконе.
Ну и конечно, классы могут его реализовывать через implements. Всё чинно, благородно.
А теперь type, он же псевдоним типа. Это такой универсальный солдат, мастер на все руки. Ему похуй, что описывать: объект, примитив или какую-нибудь ебанутую конструкцию. Расширяется он через пересечение (&), что тоже выглядит логично.
type User = { name: string };
type Admin = User & { permissions: string[] };
Но где он реально вырывается вперёд, так это в продвинутых типах. С ним можно творить вещи, от которых interface просто встанет в ступор, как мартышлюшка перед бананом в бутылке.
// Union тип — выбирай один
type Status = 'success' | 'error' | 'pending';
// Кортеж — массив с жёсткой структурой
type Point = [number, number];
// Mapped Types — магия преобразования
type Readonly<T> = { readonly [P in keyof T]: T[P] };
Так что же выбрать, чувак?
- Тащи
interface, если:- Ты за классическое ООП с классами и контрактами.
- Тебе может пригодиться волшебное слияние объявлений (часто в декларациях типов).
- Херачь
type, если:- Нужен union, intersection, mapped type или кортеж. Тут без вариантов.
- Просто даёшь имя какому-нибудь примитиву или сложному вычисляемому типу.
По правде говоря, для описания обычных объектов разница — хуй с горы. Можно хоть монетку кидать. Но когда дело доходит до сложных сценариев, понимание этих различий — это как знать, где у машины аварийный тормоз. Пригодится в самый неожиданный момент.
Видео-ответы
▶
▶
▶
▶
▶
▶