Comments 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: разница есть, но не всегда