2015-12-25 2 views
13

Когда я комментирую класс с метаданными в TypeScript, например. для создания компонента Angular2, могу ли я получить доступ к метаданным внутри этого класса?Доступ к мета-аннотации внутри класса (TypeScript)

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    templateUrl: '/app/components/app/app.component.html' 
}) 
export class AppComponent { 

    // can I access 'templateUrl' from above annotation here? 

} 
+0

Общий ответ: «это зависит», декоратор является только то, что оборачивает свой класс. Это возможно для того, чтобы выявить правопреемника или нет - как он выбирает. Это не означает, что вы имеете доступ к нему - на самом деле он может вообще игнорировать переданный ему параметр. –

ответ

18

Вы можете увидеть аннотацию/декоратор как обычный вызов функции. К этой функции объект «Класс/Функция» (не экземпляр) получает посылку в первом параметре и параметры (метаданные) во втором аргументе.

Однако это зависит от реализации этой функции, если что-то добавляется, например, к прототипу класса (свойство плохой практики/экспонирования). Компилятор TypeScript и Angular2 делают все по-другому.

Они используют функции __decorate и __metadata, которые генерируются компилятором TypeScript. Данные добавляются с помощью функции Object.defineProperty(). Пакет, ответственный за это, - Reflect. (который под капотом использует функцию Object.defineProperty() в сочетании с WeakMap).

Функция Reflect.defineMetadata() используется для установки аннотаций и получения их очевидного Reflect.getMetadata().

TLDR;

  • Чтобы получить аннотации из класса/компоненты в angular2, у вас есть использовать:

    Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ... 
    
  • Чтобы получить аннотации из конструктора PARAMATERS в angular2, вы должны использовать:

    Reflect.getMetadata('parameters', ComponentClass); //@Inject() 
    
  • чтобы получить аннотации из свойства в классе в angular2, вы должны использовать:

    Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ... 
    
Смежные вопросы