👩💻 Разница между интерфейсами и типами в typescript Вопрос, который попался мне на собесе и мне не удалось его полностью раскрыть. Давайте попробуем разобраться в основных отличиях.
1. Синтаксическое отличие.
Объявление через ключевые слова interface и type.
Интерфейсы в ts: `interface User { name: string; age: number; }
Типы в ts: `type User = { name: string; age: number; };
2. Расширение
Интерфейсы могут расширять другие интерфейсы с помощью ключевого слова extends
`interface Person { name: string; }
interface User extends Person { age: number; }
Типы могут быть объединены с помощью операторов & (пересечение).
`type Person = { name: string; };
type User = Person & { age: number; };
3. Объединение и пересечение
Интерфейсы не поддерживают объединение (|) или пересечение (&) напрямую. Они могут только расширять другие интерфейсы.
Типы поддерживают объединение и пересечение:
`type A = { a: string }; type B = { b: number }; type C = A | B; // Объединение type D = A & B; // Пересечение
4. Декларативное слияние
Интерфейсы поддерживают декларативное слияние. Если вы объявляете два интерфейса с одинаковым именем, они автоматически объединяются.
`interface User { name: string; }
interface User { age: number; }
const user: User = { name: "John", age: 30, };
Типы не поддерживают декларативное слияние. Если вы попытаетесь объявить два типа с одинаковым именем, это вызовет ошибку.
5. Использование с примитивами
Интерфейсы не могут быть использованы для описания примитивных типов. Типы могут описывать примитивные типы, объединения и другие сложные структуры
6. Использование в классах
Интерфейсы могут быть реализованы классами с помощью ключевого слова implements.
`interface Person { name: string; greet(): void; }
class User implements Person {
name: string;
constructor(name: string) {
this.name = name;
}
greet() {
console.log(Hello, ${this.name});
}
}
Типы не могут быть реализованы классами напрямую.```````