2016-06-20 9 views
3

Ich möchte nur die Schnittstellen meines Modells anstelle des Dokuments exportieren, so dass niemand mein Modell ändern kann, wenn es nicht innerhalb seiner eigenen Klassenmethoden ist. Ich habe die Schnittstelle und das Schema wie folgt definiert:Mongoose + Typescript -> Exportieren von Modell-Schnittstelle

IUser:

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

Und das Schema:

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 {} 

Und dann das Modell

// Model 
let Users: Mongoose.Model<UserDocument> = Mongoose.model<UserDocument>('User', userSchema); 

so dass ich nur den Export der IUser und ein Klassenbenutzer, der grundsätzlich alle Methoden hat, um mein Modell zu aktualisieren.

Das Problem ist, dass Typoskript beschwert, wenn ich die _id zu meiner Schnittstelle hinzufügen, aber ich brauche es tatsächlich, sonst muss ich das UserDocument übergeben und das ist, was ich nicht wollte. Das Fehler typescript gibt mir ist:

Fehler TS2320: Schnittstelle 'UserDocument' kann nicht gleichzeitig Typen 'IUser' und 'Dokument' erweitern. Benannte Eigenschaft '_id' der Typen 'IUser' und 'Document' sind nicht identisch.

Irgendwelche Ideen, wie ich die _id-Eigenschaft zu meiner Schnittstelle hinzufügen kann?

Danke!

+0

'_id' in Mongoose ist standardmäßig vom Typ' ObjectId' ('mongoose.Schema.Types.ObjectId'). – robertklep

+0

Hallo @robertklep, habe ich das schon anstelle von String versucht, und es gibt mir den gleichen Fehler, nur wenn ich _id: irgendjemand es aufhört zu beschweren, aber das ist nicht ideal. – asheinfeld

+0

Schade :(Ich habe keine Erfahrung mit TS was auch immer kann Ihnen nicht weiter helfen Ich habe Angst. – robertklep

Antwort

6

Versuchen:

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

Es wird der Konflikt zwischen IUser._id (string) vs Mongoose.Document._id (any) lösen.

aktualisieren:

Wie bereits in den Kommentaren aus, zur Zeit gibt es eine incompatible override for member from "Document", so muss eine andere Abhilfe verwendet werden. Intersection types ist eine Lösung, die verwendet werden kann. Das heißt, kann folgendes geschehen:

type UserDocument = IUser & Mongoose.Document; 

Alternativ, wenn Sie mehr nicht UserDocument wollen:

// Model 
let Users = Mongoose.model<IUser & Mongoose.Document>('User', userSchema); 

Es ist erwähnenswert, dass es eine Nebenwirkung in dieser Lösung. Bei den widersprüchlichen Eigenschaften werden die Typen durchschnitten, sodass sich beispielsweise IUser._id (string) & Mongoose.Document._id (any) in UserDocument._id (any) ergibt.

+0

Es funktionierte wie ein Charme, danke! – asheinfeld

+1

Sie sicher? Dies gibt 'inkompatible Überschreibung für Mitglied von" Document "' –