Pull to refresh

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 полей ей знать ни к чему.

Sign up to leave a comment.

Articles