Отличие types от interface
В TypeScript и type, и interface используются для определения типов данных, но они имеют некоторые различия в синтаксисе, возможностях и использовании.
1. Синтаксис
type:
Используется ключевое слово type для создания псевдонимов типов.
type User = {
name: string;
age: number;
};
interface:
Используется ключевое слово interface.
interface User {
name: string;
age: number;
}
2. Расширение
type:
Для расширения типов используется оператор & (intersection).
type Person = {
name: string;
};
type User = Person & {
age: number;
};
interface:
Для расширения интерфейсов используется ключевое слово extends.
interface Person {
name: string;
}
interface User extends Person {
age: number;
}
3. Объединение типов
type:
Может создавать объединения (union) и пересечения (intersection) типов.
type ID = string | number; // Union type
type Combined = TypeA & TypeB; // Intersection type
interface:
Не поддерживает объединения или пересечения напрямую. Однако можно расширять интерфейсы, чтобы достичь похожего результата.
interface A {
propA: string;
}
interface B {
propB: number;
}
interface Combined extends A, B {}
4. Примитивные типы и сложные конструкции
type:
Может использоваться для определения примитивных типов, union-типов, кортежей и других сложных конструкций.
type StringOrNumber = string | number;
type Tuple = [string, number];
interface:
Используется только для описания объектов. Не может использоваться для примитивов, union-типов или кортежей.
// Так нельзя:
interface StringOrNumber = string | number; // Ошибка
5. Декларативное слияние
type:
Не поддерживает слияние. Если вы определите два типа с одинаковым именем, это вызовет ошибку.
type User = { name: string };
type User = { age: number }; // Ошибка: Дубликат идентификатора 'User'
interface:
Поддерживает слияние. Если вы определите два интерфейса с одинаковым именем, они объединятся.
interface User {
name: string;
}
interface User {
age: number;
}
const user: User = {
name: "John",
age: 30,
};
6. Использование с классами
type:
Не может быть реализован классом напрямую.
type Person = {
name: string;
};
class User implements Person { // Ошибка: Нельзя использовать type для реализации
name: string;
}
interface:
Может быть реализован классом.
interface Person {
name: string;
}
class User implements Person {
name: string;
}
7. Производительность
type:
Может быть менее производительным при работе с большими и сложными типами, так как TypeScript каждый раз вычисляет их.
interface:
Обычно работает быстрее, так как интерфейсы кэшируются и оптимизируются компилятором.
Когда использовать type, а когда interface?
-
Используйте
type, если:- Нужно создать union-тип, intersection-тип или кортеж.
- Работаете с примитивными типами.
- Нужна гибкость в определении сложных типов.
-
Используйте
interface, если:- Работаете с объектами и классами.
- Нужно использовать декларативное слияние.
- Хотите, чтобы код был более читаемым и понятным для других разработчиков (интерфейсы часто ассоциируются с ООП).
Итог
typeиinterfaceво многом похожи, но имеют свои уникальные особенности.typeболее гибок и подходит для сложных типов.interfaceлучше подходит для объектов и классов, а также поддерживает слияние.- В большинстве случаев выбор между ними зависит от предпочтений разработчика и конкретной задачи.
🚀 Источник: DeepSeek