我想只导出我的模型的接口而不是Document,这样如果不在我自己的类方法中,没有人可以修改我的模型.我已经定义了这样的接口和架构:
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,'last_login': {'type': Number,'default': 0},}); interface UserDocument extends IUser,Mongoose.Document {}
然后是模型
// Model let Users: Mongoose.Model<UserDocument> = Mongoose.model<UserDocument>('User',userSchema);
所以我只是导出IUser和一个类用户,基本上有所有方法来更新我的模型.
问题是打字稿抱怨如果我将_id添加到我的界面,但我实际上需要它,否则我将需要传递UserDocument,这就是我不想做的事情.错误打字稿给我的是:
错误TS2320:接口’UserDocument’不能同时扩展类型’IUser’和’Document’.
类型’IUser’和’Document’的命名属性’_id’不相同.
谢谢!
解决方法
尝试:
interface UserDocument extends IUser,Mongoose.Document { _id: string; }
它将解决IUser._id(string)与Mongoose.Document._id(any)之间的冲突.
更新:
正如评论中所指出的,目前它为“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).