
Комментарии 6
Имена интерфейсов всегда будут отображаться в сообщениях об ошибках в исходном виде, но только если они используются по имени.
В случае с описанием типа через type, он тоже будет отображаться в сообщениях об ошибках при использовании по имени:
type Mammal = {
name: string
}
function echoMammal(m: Mammal) {
console.log(m.name)
}
echoMammal({ name: 12343 })
// ^
// The expected type comes from property 'name' which is declared here on type 'Mammal'Впрочем, это логично. TS может использовать имя типа, если этот тип явно поименован.
Таким образом, здесь interface и type не отличаются.
Всегда используйте типы, и никогда интерфейсы. Все. Лишние символы в языке это мусор, от которого нужно избавляться.
Интерфейсы нужны, чтобы описывать логически связанные группы свойств, которые не тянут на самодостаточный тип в терминах бизнес-логики.
И лучше по возможности собирать классы из нескольких интерфейсов, чем наоборот потом расковыривать переусложненные типы при помощи Partial, Pick, Omit и прочей трудночитаемой бесовщины.
Например, объект SomeObject содержит 50 полей, но для перемещения его по плоскости нам нужно знать его координаты x, y и угол поворота phi. Выделяем их в интерфейс типа IPosition - и если у наc есть условная функция move, то она ожидает в качестве параметра именно IPosition, а не SomeObject потому что остальные 47 полей ей знать ни к чему.


Type VS Interface: разница есть, но не всегда