interface и type ~90% interchangeable для object shapes; реальные отличия: interfaces merge и extend (open, public APIs, augmentation), type aliases name anything — unions, tuples, primitives, mapped/conditional — и closed.
interface — shape object/class. type — name for any type expression. Каждый interface можно записать type alias, но не наоборот — interface X = string | number нельзя, union не shape.
Dividing question: хочу extendable/augmentable? Interfaces open — duplicate interface merges (declaration merging). Type aliases closed — duplicate name hard error. Library public APIs и patchable globals (Window) → interfaces; internal unions, function types, computed → aliases.
Итог
Open merging interfaces vs closed expressive type aliases — главный критерий выбора.