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).
| 归档时间: |
|
| 查看次数: |
1815 次 |
| 最近记录: |