Mongoose + Typescript - >导出模型界面

alb*_*osh 7 mongoose node.js typescript

我想只导出我的模型的接口而不是Document,这样如果不在我自己的类方法中,没有人可以修改我的模型.我已经定义了这样的接口和架构:

IUSER:

interface IUser {
  _id: string;
  name: string;
  email: string;
  created_at: number;
  updated_at: number;
  last_login: number;
}
Run Code Online (Sandbox Code Playgroud)

架构:

let userSchema: Mongoose.Schema = new Mongoose.Schema({
   'name': String,
   'email': String,
   'created_at': {'type': Date, 'default': Date.now},
   'updated_at': {'type': Date, 'default': Date.now},
   'last_login': {'type': Number, 'default': 0},
});

interface UserDocument extends IUser, Mongoose.Document {}
Run Code Online (Sandbox Code Playgroud)

然后是模型

// Model
let Users: Mongoose.Model<UserDocument> = Mongoose.model<UserDocument>('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

所以我只是导出IUser和一个类用户,基本上有所有方法来更新我的模型.

问题是打字稿抱怨如果我将_id添加到我的界面,但我实际上需要它,否则我将需要传递UserDocument,这就是我不想做的事情.错误打字稿给我的是:

错误TS2320:接口'UserDocument'不能同时扩展类型'IUser'和'Document'.类型'IUser'和'Document'的命名属性'_id'不相同.

我有什么想法可以将_id属性添加到我的界面?

谢谢!

Nat*_*gos 11

尝试:

interface UserDocument extends IUser, Mongoose.Document {
   _id: string;
}
Run Code Online (Sandbox Code Playgroud)

它将解决IUser._id(string)与Mongoose.Document._id(any)之间的冲突.

更新:

正如评论中指出的那样,目前它给出了一个incompatible override for member from "Document",所以必须使用另一种解决方法.交叉点类型是可以使用的解决方案.也就是说,可以做到以下几点:

type UserDocument = IUser & Mongoose.Document;
Run Code Online (Sandbox Code Playgroud)

或者,如果您不再需要UserDocument:

// Model
let Users = Mongoose.model<IUser & Mongoose.Document>('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

值得注意的是,此解决方案存在副作用.冲突的属性将具有相交的类型,因此例如IUser._id (string) & Mongoose.Document._id (any)导致UserDocument._id (any).