2016-12-02 4 views
1

클래스 속성을 열거 할 수 없도록하려면 TypeScript에서 데코레이터를 만들고 싶습니다. 속성에 TypeScript @Enumerable (false) 데코레이터를 만드는 방법

나는 @enumerable 여기의 예를 발견 : https://www.typescriptlang.org/docs/handbook/decorators.html#method-decorators 을하지만 그건 단지 방법이 아닌 속성에 대한 작동하는 것 같다, • 부동산의 기술자가 인수로 제공되지 않습니다

https://www.typescriptlang.org/docs/handbook/decorators.html#property-decorators

참고 TypeScript에서 속성 데코레이터가 초기화되는 방식으로 인해 속성 데코레이터가 발생합니다. 현재 프로토 타입의 멤버를 정의 할 때 인스턴스 속성을 설명하는 메커니즘이 없기 때문에 및 속성의 초기화 프로그램을 관찰하거나 수정할 방법이 없기 때문입니다. 과 같이 속성 꾸미기는 특정 이름의 속성 이 클래스에 대해 선언 된 것을 관찰하는 데만 사용할 수 있습니다.

클래스 속성에 @enumerable 데코레이터를 만드는 방법이 있습니까?

감사

답변

4

나는이 솔루션을 결국 :

/** 
* @enumerable decorator that sets the enumerable property of a class field to false. 
* @param value true|false 
*/ 
function enumerable(value: boolean) { 
    return function (target: any, propertyKey: string) { 
     let descriptor = Object.getOwnPropertyDescriptor(target, propertyKey) || {}; 
     if (descriptor.enumerable != value) { 
      descriptor.enumerable = value; 
      Object.defineProperty(target, propertyKey, descriptor) 
     } 
    }; 
} 

사용법 :

class User { 
    id:string; 

    @enumerable(false) 
    name: string; 
} 

테스트 :

var user = new User(); 
    user.id = 1; 
    user.name = 'John Doe'; 
    for (key in user){ console.log(key, user[key]);} 

출력

데코레이터를 사용하지 않고3210
id 1 

같은 테스트

id 1 
name John Doe 
관련 문제