MongoDB и TypeScript: отделить тип идентификатора сущности домена от ObjectID MongoDB - PullRequest
2 голосов
/ 21 февраля 2020

Внутри моих репозиториев MongoDB сущности имеют тип _id: ObjectID для правильной обработки. Однако я хотел бы, чтобы у моих доменных сущностей был простой атрибут id: string, чтобы избежать каких-либо зависимостей от любой базы данных или инфраструктуры. Решение, которое я придумала до сих пор, выглядит следующим образом:

export interface Book {
  id: string;
  title: string;
}

// A MongodbEntity<Book> would now have an _id instead of its string id
export type MongodbEntity<T extends { id: string; }> = Omit<T, 'id'> & { _id: ObjectID; };

В моем хранилище это будет работать:

async findOneById(id: string): Promise<Book | null> {
  const res = await this.collection.findOneById({_id: new ObjectId(id)});
  return res ? toBook(res) : null;
}

function toBook(dbBook: MongodbEntity<Book>): Book {
  const {_id, ...rest} = dbBook;
  return {...rest, id: _id.toHexString() };
}

Что не работает, так это сделать такое поведение обобщенным c. Функция преобразователя, подобная этой:

function toDomainEntity<T extends {id: string}>(dbEntity: MongoDbEntity<T>): T {
  const {_id, ...rest} = dbEntity;
  return {...rest, id: _id.toHexString() };
}

, приводит к ошибке, описанной здесь .

То, что я ищу, это либо рабочее решение для функции generi c toDomainEntity, либо другой (generi c) подход, который позволил бы мне отделить типы сущностей моего домена от _id: ObjectID MongoDB. тип.

...