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