2016-06-20 18 views
3

ドキュメントの代わりにモデルのインターフェイスのみをエクスポートして、自分のクラスメソッド内にモデルがない場合、誰もモデルを変更できないようにします。Mongoose + Typescript - >モデルインターフェイスのエクスポート

た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です。

問題は、そうでない場合、私はのUserDocumentを渡す必要があります、私は私のインターフェイスに_idを追加し、私は実際にそれを必要とする場合typescriptですが文句を言っていることであり、それは私がやってみたかっなかったものです。エラータイプスクリプトが私に与えるもの:

エラーTS2320: 'UserDocument'インターフェイスは、 'IUser'と 'Document'タイプを同時に拡張できません。 タイプ 'IUser'と 'Document'の名前付きプロパティ '_id'は同一ではありません。

どのようにすれば私のインターフェイスに_idプロパティを追加できますか?

ありがとうございます!

+0

Mongooseの '_id'は、デフォルトで' ObjectId'( 'mongoose.Schema.Types.ObjectId')型です。 – robertklep

+0

こんにちは@robertklep、私はすでに文字列の代わりにそれを試して、それは私に_idを置く場合にのみ、私に同じエラーを与えます:それは不平を停止しますが、それは理想的ではありません。 – asheinfeld

+0

あまりにも悪い:(私はTSを全く経験していないので、それ以上あなたを助けることはできません。 – robertklep

答えて

6

試してみてください。

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

それはMongoose.Document._id対IUser._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)となります。

+0

それは魅力的な働きをしました! – asheinfeld

+1

確かに?これは、 –

関連する問題