У меня есть простой сценарий входа в систему, который требует ввода пользователем электронной почты и пароля в Typescript. Мне нужно создать какой-то тип, чтобы получить этот строгий тип и отправить его в серверную часть.
Следует ли это записать как:
export interface UserLogin {
email: string;
password: string;
}
//OR
export class UserLogin {
email: string;
password: string;
}
И как узнать, когда можно использовать любой из них?






По сути, учебный класс - это, по сути, фабрика объектов (то есть план того, как объект должен выглядеть, а затем реализован), тогда как интерфейс - это структура, используемая исключительно для проверка типов.
В то время как учебный класс может иметь инициализированные свойства и методы, помогающие создавать объекты, интерфейс по существу определяет свойства и тип, которые может иметь объект.
В описанном вами сценарии можно использовать интерфейс для установки типа UserLogin.
send it to the back-end
Отправка классов по сети требует дополнительных усилий - если вы используете тип содержимого JSON, ваш класс станет простым объектом для вашего внутреннего кода. См. многочисленные ответы для этого вопроса, рассказывающего, как преобразовать JSON обратно в объект класса, чтобы можно было вызывать его методы.
Но поскольку класс в вашем вопросе не имеет методов, это не имеет значения, если только внутренний код не будет выполнять проверки времени выполнения с использованием instanceof.
Чтобы избежать этих проблем, используйте интерфейс, который имеет только члены данных для представления объектов для связи с серверной частью.
На самом деле оба сделают свою работу. Я бы посоветовал вам использовать интерфейсы, если вы просто выполняете проверку типов, поскольку он специально разработан для этой цели.
Classes and interfaces are powerful structures that facilitate not just object-oriented programming but also type-checking in TypeScript. A class is a blueprint from which we can create objects that share the same configuration - properties and methods. An interface is a group of related properties and methods that describe an object, but neither provides implementation nor initialisation for them.
От: https://toddmotto.com/classes-vs-interfaces-in-typescript
Если вам просто нужно объявить настраиваемый тип, используйте интерфейсы. IMO, есть очень прагматическая причина - они не переносятся в JavaScript, поэтому сгенерированный код короче.
Интерфейсы не будут работать, если вам нужно создать экземпляры объектов с помощью конструкторов или использовать структуру, которая создает и внедряет их. Затем используйте классы или абстрактные классы.