2016-06-20 2 views
3

Я хочу экспортировать только документы моей модели вместо Документа, чтобы никто не мог модифицировать мою модель, если она не находится внутри собственных методов класса. Я определил интерфейс и схему так:Mongoose + Typcript -> Экспорт интерфейса модели

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 и пользователь класса, который в основном имеет все методы для обновления моей модели.

Проблема заключается в том, что машинописный шрифт жалуется, если я добавляю _id в свой интерфейс, но на самом деле мне это нужно, иначе мне нужно будет передать UserDocument, и это то, чего я не хотел делать. Ошибка typescript дает мне:

ошибка TS2320: интерфейс UserDocument не может одновременно расширять IUser 'и' Document '. Именованное свойство «_id» типов «IUser» и «Document» не идентично.

Любые идеи, как я могу добавить свойство _id в свой интерфейс?

Спасибо!

+0

'_id' в Mongoose по умолчанию является' ObjectId' ('mongoose.Schema.Types.ObjectId'). – robertklep

+0

Привет @robertklep, я попробовал это уже вместо строки, и это дает мне ту же ошибку, только если я ставлю _id: любой он перестает жаловаться, но это не идеально. – asheinfeld

+0

Слишком плохо :(У меня нет опыта работы с TS, так что я не могу вам больше бояться. – robertklep

ответ

6

Try:

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

Это разрешит конфликт между IUser._id (строка) против Mongoose.Document._id (любой).

Update:

Как было отмечено в комментариях, в настоящее время он дает 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).

+0

Он работал как шарм, спасибо! – asheinfeld

+1

Вы уверены? Это дает «несовместимое переопределение для члена из« Документа »' –

Смежные вопросы