Open ghost opened 4 years ago
NOTE A Property Descriptor is not provided as an argument to a property decorator due to how property decorators are initialized in TypeScript. This is because there is currently no mechanism to describe an instance property when defining members of a prototype, and no way to observe or modify the initializer for a property. The return value is ignored too. As such, a property decorator can only be used to observe that a property of a specific name has been declared for a class. https://www.typescriptlang.org/docs/handbook/decorators.html
실제 문제는 property initializer 있는 것처럼 보인다. TSC는 클래스 인스턴스에 Object.defineProperty를 추가하지 않고 프로토타입에 decorator만 추가하는 반면, Babel은 그 인스턴스의 property를 정의한다.
그래서, prototype에 decorated된 getter가 정확히 있지만, 인스턴스는 그것에 접근할 수 없다.
내가 보기에 inversifyjs decorator는 initializer 없이 getter와 setter를 가지고 노는 것 같고, 이것은 스펙과 맞지 않는다. eddy
님 코멘트
background
Cherny, Boris. Programming TypeScript . O'Reilly Media. Kindle Edition. 를 읽고 있습니다.
책 본문의 내용을 간략히 하면 class decorator를 사용하는 경우 하기 명시한 코드와 같이 complie 에러가 나기 때문에 decorator 가 정식 기능이 될 때까지는 다른 방법으로 데코레이터를 대신 하라는 내용입니다.
질문
저는 에러가 나는 이유를 데코레이터가 리턴한 class 의 type 에 대해 typescript 가 infer 하지 못하기 때문이고, infer를 못하는 이유는 데코레이터가 runtime 에 실행되기 때문이라고 이해했는데, 제가 이해한게 맞나요?
코드
본문 인용