Внутри моих репозиториев 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. тип.