Опустите свойство объекта в typescript

#typescript

Вопрос:

У меня есть следующий код

 export interface UserModel {
  id: string;
  email: string;
  password: string;
  firstName: string;
  lastName: string;
}
 

Эта модель определяет модель БД. У меня также есть интерфейс, который используется в качестве ответа от API.

 export type UserGetResponse = Omit<UserModel, "id" | "password">;
 

Я не хочу отвечать свойствами id и. password Позже при извлечении данных из базы данных я делаю что-то вроде этого

 User.scan().then((users: UserModel[]) => users.map((user: UserModel) => user as UserGetResponse))
 

но id и password не удаляются из ответа. Есть ли лучший способ сделать это. Должен ли я создать класс с конструктором, который получает объект UserModel и присваивает только нужные мне свойства?

Ответ №1:

Вы можете сделать это с помощью подхода «черный список». Что-то вроде:

 User
  .scan()
  .then((users: UserModel[]) => users.map((user: UserModel) => {
    ...user,
    id: undefined,
    password: undefined,
  } as UserGetResponse))
 

Или, что еще лучше, вы можете сделать это с помощью подхода «белый список». Что-то вроде:

 User
  .scan()
  .then((users: UserModel[]) => users.map((user: UserModel) => {
    firstName: user.firstName,
    lastName: user.lastName,
    email: user.email,
  } as UserGetResponse))
 

Белый список, на мой взгляд, лучше, так как в нем нет риска автоматического включения дополнительных свойств, если/когда структура данных будет расширена.