2016-10-26 3 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 것을 추론하는 타이프 라이터를 요구하고있다

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

질문이 남아 있습니다 :'baz '란 무엇이고 왜 TypeScript가'foo' ('this라고 생각해야합니다'의 유형이어야합니다)에'baz' 속성이 없다는 것을 알려주지 않는 이유는 무엇입니까? TypeScript에 대한 지식이 많지는 않지만, 유형이 명시 적으로 속성을 정의해야한다는 요점은 아닙니다. 나는'lexically 바운드 함수 내에서'any' 타입의'this'가'foo' 타입이 아닌 이유가 무엇인지 생각해 봅니다. – meagar

+1

@meagar :'foo'는'this'의 유형이어서는 안됩니다. 'this'는 객체 리터럴을 포함하는 함수에서 'this'가 무엇이든간에됩니다. – Ryan

+0

아, 네. 나는 우리가 ES6 클래스 선언에 있지 않다는 사실에 착각했다. 그렇다면 왜 TypeScript는 객체 리터럴 선언의 문맥을 보지 않고'this'가'baz' 속성을 갖지 않는 것을 보게됩니까? – meagar

2

.

Typescript는 지방 화살표가 선언 된 this -context에 바인딩 된 로컬 변수 _this을 생성하여 this을 바인드합니다. 그리고 귀하의 경우 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; 
}()); 
관련 문제