2016-05-03 12 views
2

私はTypeScriptでmongooseモデルを実装しようとしていますが、それは機能しません。このコードではなく、警告をコンパイル:Typescript:mongooseスキーマの静的メソッド

import crypto = require('crypto') 
import mongoose = require('mongoose') 
mongoose.Promise = require('bluebird') 
import {Schema} from 'mongoose' 

const UserSchema = new Schema({ 
    name: String, 
    email: { 
    type: String, 
    lowercase: true, 
    required: true 
    }, 
    role: { 
    type: String, 
    default: 'user' 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
provider: String, 
    salt: String 
}); 

/** 
* Methods 
*/ 
UserSchema.methods = { 
    // my static methods... like makeSalt, etc 
}; 

export default mongoose.model('User', UserSchema); 

しかしtypescriptですが不平を言っている:

error TS2339: Property 'methods' does not exist on type 'Schema'.

を、私はいくつかのインターフェイスを拡張する必要があることを前提としています。これを指すポインタはどれですか?

答えて

0

スキーマ型指定では、デフォルトで拡張子が使用できません。タイプスクリプトのインターフェイスはオープンで拡張可能です。拡張しているフィールドを含むようにSchemaの型を拡張する必要があります。そうしないと、typescriptはそれについて知りません。これは型を拡張するための良い答えです。 How do you explicitly set a new property on `window` in TypeScript?

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/mongoose/mongoose.d.tsを見ると、マングースの一般的な入力が表示されます。

あなたがクラスを拡張することができる場合、私は知らないけれどもあなたが最も可能性の高い行うために探している以下の通りです:

スキーマ-extended.d.ts

module "mongoose" { 
    export class Schema { 
     methods:any 
    } 
} 

次に、あなたのコード内で:

///<reference path="./schema-extended.d.ts" /> 
//Schema should now have methods as a property. 
new Schema().methods 
+0

変数をインポートすると機能しない点を除いて、本当に良いです。 'mongoose'からimport {Schema} インポート宣言が 'Schema'のローカル宣言と競合します – Nico

+0

また、スキーマが一部であるモジュールを拡張し、スキーマを直接作成しないでください。スキーマの入力を見て、どのモジュールが入っているかを確認します。 – ArcSine

+0

私は正しく理解しているかどうかはわかりません。あなたは詳しく説明できますか? – Nico

関連する問題