2017-12-17 7 views
2

는 일반적으로 나는이 같은 장식을 적용개체 속성에 데코레이터를 사용할 수 있습니까?

class SpecialMethods { 
    @Deco 
    static someMethod() { 
    } 
} 

는 클래스가 아닌 일반 객체를 사용하는 몇 가지 방법이있다 :

const SpecialMethods = { 
    @Deco 
    someMethod:() => {} 
} 
+1

어떤 데코레이터를 사용 하시겠습니까? 그 제안들? –

+1

'추상 클래스 '란 무엇입니까? 이것은 자바 스크립트처럼 보이지 않습니다. – Bergi

+0

@Bergi 죄송합니다, 현재 타이프 크립을 사용하고 있습니다. 추상을 제거했습니다. – Chris

답변

0

네,하지만 매우 실용적이지. 객체의 속성에 대해 데코레이터를 호출 할 수 있지만 클래스 및 그 내용을 꾸미는 것과는 다릅니다.

주어진 다음의 장식 : 클래스에 다음과 같이

const TestDecorator = (at: string) => { 
    return function (target: any, prop: string, descriptor?: PropertyDescriptor) { 
     console.log(`decorated at ${at}}`); 
    } 
} 

사용되는 : 그러나

class TestClass { 
    @TestDecorator('class method') 
    public testMethod() { } 
} 

, 그것은 속성에 대해 위와 같은 방법을 적용 할 수 없습니다 :

const testObj = { 
    @TestDecorator('property method') 
    testMethod:() => { } 
}; 

이 문제를 해결하려면 속성에서 데코레이터를 호출 할 수 있습니다.

처음에는 모든 특성을 가진 개체를 선언해야 : 수동 속성에 대한 deco 장식을 호출해야 이제

const deco = TestDecorator('property method'); 

:

const testObj = { 
    testMethod:() => { } 
}; 

내 장식은 카레 값을 기대 testObj :

deco(testObj, 'testMethod'); 

(가 영업 이익에없는) 당신의 장식에 propertyDescriptor이 필요합니다, 당신은 수동으로뿐만 아니라 그것을 제공해야합니다 :

여기
deco(testObj, 'testMethod', Object.getOwnPropertyDescriptor(testObj, 'testMethod')); 

TS playground이다. 콘솔에서 출력을 확인하십시오.

+0

왜 속성 설명자를 전달하지 않습니까? – Bergi

+0

@Bergi이 예제에서는 그 필요가 없습니다. 이것은'객체'에 대한 데코레이터를 호출하는 방법만을 보여 주며, 데코레이터 내에서 아무것도 조작하지 않습니다. –

+0

글쎄, 그렇긴하지만 그것은 실제 장식자가하는 일에 많이 의존하기 때문에 일반적인 해결책을 제시하는 것이 좋을 것이다. – Bergi

관련 문제