从猫鼬 HydratedDocument 中删除某些字段

Remove certain fields from the mongoose HydratedDocument

当我们学习文档时,id 属性 仍然包含未定义,可能会导致意外错误。

为了为我的团队简化这一过程,我想从自定义类型的 HydratedDocument 中删除 id 字段。

// @types/mongoose/index.d.ts

import 'mongoose';
import { HydratedDocument as _Hydra, Document as _Docu } from 'mongoose';

declare module 'mongoose' {
  export type HydratedDocument<T, TMethodsAndOverrides, TVirtuals> = Omit<_Hydra<T>, 'id' | '__v'>;
// tsconfig.json
"typeRoots": ["node_modules/@types", "@types"] 

它仍然不适合我。当我导入类型并尝试声明一个变量时。然后我发现实际上 id 属性 来自文档 class。以下是更新后的打字

import 'mongoose';
import { HydratedDocument as _Hydra, Document as _Docu } from 'mongoose';

declare module 'mongoose' {
  export type HydratedDocument<T, TMethodsAndOverrides, TVirtuals> = Omit<_Hydra<T>, 'id' | '__v'>;
  export class Document implements Omit<_Docu, 'id'> {}
}

不幸的是,这也不起作用。

这是不可能的。但是我目前正在使用一个 hack

import { Document } from 'mongoose';
import { ObjectId } from 'bson';

type _MongooseDoc<T> = Document<unknown, any, T> & T & { _id: ObjectId };

export type MongooseDoc<T> = Omit<_MongooseDoc<T>, '__v' | 'id'>;

export type MongooseRef<T> = MongooseDoc<T> | string | ObjectId;

export type MongooseLean<T> = Omit<MongooseDoc<T>, keyof Document<unknown, any, T>> & { _id: ObjectId };