Оба механизма — interface и type alias — позволяют описывать структуры данных (объекты, функции, сложные типы).
Отличия:
|) и пересечения (&).Пример:
interface Animal { name: string } interface Dog extends Animal { bark(): void } // type alias для объединения типов: type MyType = string | number type Cat = Animal & { purr(): void }
Рекомендуется:
interface.type.Вопрос: Можно ли добавить новое поле к типу, определённому через type alias, в другом файле?
Ответ:
Нет. Type alias нельзя расширять декларативно из другого файла, в отличие от interface.
Пример:
// main.ts type User = { name: string } // another.ts type User = { age: number } // Ошибка: Duplicate identifier // interface: // main.ts interface User { name: string } // another.ts interface User { age: number } // Ок, User = { name: string, age: number }
История
На большом проекте определяли общие структуры данных через type alias. Когда понадобилось добавить поле существующему типу из другого пакета, оказалось, что type alias не поддерживает declaration merging — пришлось переписывать на interface, что вызвало задержки.
История
Один из разработчиков описал функции через interface, а затем попытался добавить Union тип (строку или функцию) — выяснилось, что interface для этого не подходит, и пришлось менять все определения на type alias с intersection/union.
История
После смены типа с interface на type alias перепутали синтаксис расширения: пытались использовать extends, вместо объединения через &. Ошибка проявилась поздно и не сразу поняли причину.