我只想导出模型的接口(interface)而不是文档,因此如果模型不在其自己的类方法之内,则没人可以对其进行修改。我已经定义了这样的接口(interface)和模式:

IUser:

interface IUser {
  _id: string;
  name: string;
  email: string;
  created_at: number;
  updated_at: number;
  last_login: number;
}

和模式:
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 {}

然后是模型
// Model
let Users: Mongoose.Model<UserDocument> = Mongoose.model<UserDocument>('User', userSchema);

因此,我只是导出IUser和一个类User,该类基本上具有用于更新模型的所有方法。

问题是如果我将_id添加到我的界面中, typescript 会提示,但是我实际上需要它,否则我将需要传递UserDocument,而这正是我不想做的。错误 typescript 给我的是:

错误TS2320:接口(interface)“UserDocument”不能同时扩展类型“IUser”和“Document”。
类型为“IUser”和“文档”的命名属性“_id”不相同。


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

谢谢!

最佳答案

尝试:

interface UserDocument extends IUser, Mongoose.Document {
   _id: string;
}

它将解决IUser._id(字符串)与Mongoose.Document._id(任意)之间的冲突。

更新:

正如注释中指出的那样,当前它给出了incompatible override for member from "Document",因此必须使用另一种解决方法。 Intersection types是可以使用的解决方案。也就是说,可以执行以下操作:
type UserDocument = IUser & Mongoose.Document;

或者,如果您不再想要UserDocument了:
// Model
let Users = Mongoose.model<IUser & Mongoose.Document>('User', userSchema);

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

10-08 11:46