2017-04-13 4 views
1

関数参照を別の関数のパラメータとして渡してどこかに呼び出すと、 "this"が失われます。それを防ぐには、メソッドを矢印関数にする必要があります。ここで私が何を意味するかの実例である:メソッド参照を渡すと、TSに警告が出る

class Meeseeks{ 
    private line="I'm mister Meeseeks"; 
    lookAtMe(){ console.log(this.line+', look at me!'); } 
} 
// somewhere else: 
let mr = new Meeseeks(); 
mr.lookAtMe();/// ok, prints fine 
function callIt(fn:Function){ fn(); } 
callIt(mr.lookAtMe);/// this one throws "Uncaught TypeError: Cannot read property 'line' of undefined" 

だから、それを修正する唯一の方法は、矢印関数に「lookAtMe」を有効にすることです:

lookAtMe =() => console.log(this.line+', look at me!'); 

私の質問は:活字体は、ときに私を警告することができ私は関数参照を使用しますか?コンパイル時に実行時エラーが発生するのを嫌うので、これが最初の場所でTypeScriptを使用する理由です(厳密に型指定された言語が非常に好きです)。そして今、それを防ぐために、私はすべてメソッドの矢印関数を作成し、継承には向いていません。

ご存知のtsconfigエントリまたはtslintエントリはありますか?

+0

あなたが求めているものではありませんが、これはコンストラクタのいくつかの 'bind'によって防止できます。 – Jokester

答えて

-1

いいえ、これに対して直接警告する方法はありません。

suggestion for ESLint to implement itがありましたが、実装されていませんでした。

とすることができます。まず、動作が発生しないようにonly-arrow-function TSLint ruleを使用してください。

+0

@Downvoter:なぜdownvote?これは、関数参照を避けるためのビルドプロセスステップを実装したいという、この質問に対する正しい、有効な答えです。 –

+0

あなたは、ソースコードに何ら変更を加えずにそのようなエラーを報告するアプローチにユーザが興味を持っておらず、そのようなアプローチが実際には存在するのであれば、彼の質問に答えることができないだけでなく言及されるに値するものではなく、あまりにも厳しいようで、OPのカジュアルな言及であるeslintやtsconfigフラグ以外のものではサポートされていません。 ESLintの問題へのリンクは、まったく異なるものです。 –

関連する問題