2016-10-26 10 views
2

オブジェクトリテラルの関数内で "this"を使用する場合の予想される動作は何ですか?Typescriptオブジェクトのリテラル "this"キーワード

たとえば、「bar」という名前の関数しか持たないfoo型があり、他のプロパティはありません。しかし、fooObj.barメソッドでthis.baz( "baz"は "foo"型のプロパティではありません)にアクセスできます。エラーは表示されません。 fooObjに "baz"がないので、型付きエラーを出力してはいけませんか?

type foo = { 
    bar(): void; 
} 
var fooObj: foo = { 
    bar:() => { 
     // TS does not error out when I access this.baz 
     console.log(this.baz); 
    } 
} 
+0

あなたは '「noImplicitThis」を設定しようとしたことがありますか? –

答えて

3

矢印機能which has lexical thisを使用しています。

オブジェクトリテラル内の非矢印関数プロパティの省略表現は、しかし、さらに短いです:あなたはthisfooObjであることを推測するためにtypescriptですが求めている

var fooObj: foo = { 
    bar() { 
     console.log(this.baz); 
    } 
} 
+0

質問が残っています: 'baz'とは何ですか?また、' foo'(これは 'this 'と思われます)の型に' baz'プロパティがないことをTypeScriptが知らないのはなぜですか?私はTypeScriptについて知っているわけではありませんが、あなたの型はそのプロパティを明示的に定義する必要があります。私は疑問に思うのは、 'foo'の型ではなく、字句的に束縛された関数の中の' any'型の 'this'はなぜですか? – meagar

+1

@meagar: 'foo'は' this'の型であってはなりません。 'this'は' this'がオブジェクトリテラルを含む関数にあったものになります。 – Ryan

+0

ああ、そうです。私はES6クラスの宣言ではないという事実を見た。なぜ、TypeScriptはオブジェクト・リテラル宣言のコンテキストを見ていないのですが、 'this'は' baz'プロパティを持っていません。 – meagar

2

Typescriptは、ローカル変数_thisを作成することによってをバインドします。これは、太矢印が宣言されたthis -contextにバインドされています。あなたの場合、thisはグローバルスコープで、anyです。これは、それがにコンパイルされるものです:

var _this = this; 
var fooObj = { 
    bar: function() { 
     // TS does not error out when I access this.baz 
     console.log(_this.baz); 
    } 
}; 

これは、それがクラス内でどのように見えるかです:true`のコンパイラオプション:

class Bar 
{ 
    private var = 23; 
    public makeSound =() => console.log(this.var) 
} 

// Compiles into: 

var Bar = (function() { 
    function Bar() { 
     var _this = this; 
     this.var = 23; 
     this.makeSound = function() { return console.log(_this.var); }; 
    } 
    return Bar; 
}()); 
関連する問題