TypeScript: как использовать Reflect.metadata для внутреннего свойства? - PullRequest
0 голосов
/ 17 ноября 2018

Вот что я хочу сделать:

class MyClass {
  @Reflect.metadata("desc", "My outer property") // OK
  outerProp: {
    @Reflect.metadata("desc", "My inner property") // Error
    innerProp: string;
  };
}

Ошибка: «[ts] Свойство или ожидаемая подпись».

Почему декоратор работает для externalProp, но не для innerProp?Есть ли способ сделать это без рефакторинга типа externalProp в именованный класс?

1 Ответ

0 голосов
/ 17 ноября 2018

Отражающие аннотации могут добавляться только к классам и членам класса, как указано в документах :

Декораторы добавляют возможность увеличивать класс и его членов как класс определяется через декларативный синтаксис

Первая аннотация добавляется к свойству outerProp MyClass, что нормально:

@Reflect.metadata("desc", "My outer property") // OK
  outerProp: {

Но вторая аннотация добавляется в свойство интерфейса машинописного текста, а не класса. Это определение типа не будет существовать во время выполнения, потому что это всего лишь подсказка для компилятора машинописного текста, что означает, что вы не можете добавлять к нему аннотации:

@Reflect.metadata("desc", "My inner property") // Error
    innerProp: string;

Чтобы устранить эту ошибку, вам необходимо провести рефакторинг outerProp в именованный класс - обойти это невозможно, поскольку аннотации можно добавлять только к вещам, которые все еще присутствуют в скомпилированном javascript:

@Reflect.metadata("desc", "My outer property")
class OuterPropType {
    @Reflect.metadata("desc", "My inner property")
    innerProp: string;
}

class MyClass {
  outerProp: OuterPropType;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...