При использовании интерфейса или класса в Typescript

У меня есть простой сценарий входа в систему, который требует ввода пользователем электронной почты и пароля в Typescript. Мне нужно создать какой-то тип, чтобы получить этот строгий тип и отправить его в серверную часть.

Следует ли это записать как:

export interface UserLogin {
  email: string;
  password: string;
}
//OR
export class UserLogin {
  email: string;
  password: string;
}

И как узнать, когда можно использовать любой из них?

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
97
0
50 313
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

По сути, учебный класс - это, по сути, фабрика объектов (то есть план того, как объект должен выглядеть, а затем реализован), тогда как интерфейс - это структура, используемая исключительно для проверка типов.

В то время как учебный класс может иметь инициализированные свойства и методы, помогающие создавать объекты, интерфейс по существу определяет свойства и тип, которые может иметь объект.

В описанном вами сценарии можно использовать интерфейс для установки типа 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, поэтому сгенерированный код короче.

Интерфейсы не будут работать, если вам нужно создать экземпляры объектов с помощью конструкторов или использовать структуру, которая создает и внедряет их. Затем используйте классы или абстрактные классы.

Другие вопросы по теме