我只想导出模型的接口(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)
。