4

Inside my MongoDB repositories, entities have an _id: ObjectID type to be handled properly. However, I would like my domain entities to have a simple id: string attribute to avoid any dependencies on any database or framework. The solution I came up with so far looks as follows:

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; };

In my repository this would work:

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() };
}

What doesn't work is to make this behavior generic. A converter function like this:

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

leads to an error described here.

What I am looking for is either a working solution for the generic toDomainEntity function or a different (generic) approach that would let me decouple my domain entity types from MongoDB's _id: ObjectID type.

C. Doe
  • 1,180
  • 8
  • 12

0 Answers0