首页 > 解决方案 > TypeScript:如何在内部属性上使用 Reflect.metadata?

问题描述

这是我想做的事情:

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

错误是“需要 [ts] 属性或签名”。

为什么装饰器对 outerProp 有效,而对 innerProp 无效?有没有办法在不将 outerProp 的类型重构为命名类的情况下做到这一点?

标签: typescriptreflectionmetadata

解决方案


反射注释只能附加到类和类成员,如文档中所述:

装饰器通过声明性语法添加了在定义类时扩充类及其成员的能力

将第一个注解添加到 的outerProp属性中MyClass,就可以了:

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

但是第二个注释被添加到 typescript 接口的属性,而不是类。此类型定义不会在运行时出现,因为它只是 typescript 编译器的提示,这意味着您不能向其添加注释:

@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;
}

推荐阅读