2016-05-10 10 views
4

私はこの新しい冒険を、タイスクリプトの学習で始めました。私はjavascriptでnodejsプロジェクトを作成しました。これをtypescriptに変換しています。私の考えは、すべてのメリットを見て、どこに問題があるのか​​を知ることです。どのパターンを使うべきかなどです。
このプロジェクトでは、mongoose javascriptライブラリを使用してmongodbデータベースを使用しています。私は、typescriptがコードをどのように変換するのかと苦労しています。簡単な言葉で:私はこの参照を失う
問題の原因となる良い例を次に示します。事前に
mongoose javascriptコードをtypescriptに変換します。この参照が失われました

var personSchema = new mongoose.Schema({ 
    created: { 
    type: Date, 

    default: Date.now 
    }, 

    updated:{ 
    type: Date, 
    }, 
}); 

personSchema.pre('save', function(next) { 

// Make sure updated holds the current date/time 

this.updated = new Date(); 

next(); 

}); 

var Person = mongoose.model('Person', personSchema); 

セーブ機能この参照があります。これは、更新されたプロパティを持つ現在の人物の参照です。すべて順調。私はこのパターンをさまざまな例で見た。

これは私がnodejsプロジェクトで作業している初めてのことです。 typescriptですが、これは _this と交換されたコードをtranspilers後

interface IPerson extends mongoose.Document{ 
    created:Date; 
    updated:Date; 
} 


var personSchema = new mongoose.Schema({ 
    created: { 
    type: Date, 
    default: Date.now 
}, 

updated: { 
    type: Date 
} 
}); 

personSchema.pre('save', (next) => { 
// Make sure updated holds the current date/time 
this.updated = new Date(); 

next(); 
}); 

export = mongoose.model<IPerson>('Person', personSchema); 

:ここ
は、私は、単純なtypescriptです変換を試みた方法です。ファイルの上部に表示されますvar _this = this;。これは間違っています。新しいjavascriptファイルはpersonオブジェクトの参照を失います。

javascriptをtypescriptに正しく変換する方法を教えてもらえますか?私はこの種の問題をどのように解決すべきですか?いくつかのパターンがありますか?
私の最初の印象は、時には正式ではないJavaScriptをtypescriptに変換することですが、私は本当にそれが好きです。

答えて

0

はこれを試してみてください:

var personSchema = new mongoose.Schema({ 
    created: { 
     type: Date, 
     default: Date.now 
    }, 

    updated: { 
     type: Date 
    } 

    saveHandler(next) { 
     // Make sure updated holds the current date/time 
     this.updated = new Date(); 

     next(); 
    } 
}); 

personSchema.pre('save', personSchema.saveHandler); 
0

だから、この質問は古いの一種であり、私はあなたがすでにそれを解決したがそこには選択した答えはありませんので、これはそこに他の誰かを助けるかもしれないことはよく分かりません。

私はこれで少し自分のために苦労し、私はそれを考え出したと信じています。

また、すべてのコードが異なっているので、これはすべてのケースでそれを解決しないかもしれないが、は矢印機能を退治しようとしないことを考慮に入れます。代わりに正規の関数を使用してください。

ES6の矢印関数は字句スコープを使用しているため、この場合、実際には「これ」は期待できません。それは、まあまあ、未定義の、あるいはスキーマそのものです。それはドキュメントを指していないので、メソッドやプロパティのいずれも見つけられません。

関連する問題