reflect-metadata Reflect.getMetadata()方法不会在提供的对象的原型链上返回元数据

时间:2016-10-10 09:48:03

标签: typescript annotations prototype-chain reflect-metadata

我使用的是reflect-metadata 0.1.2。我有一个父类作为" MyCustom"。

export class MyCustom {}

我的家庭"组件类扩展了这个" MyCustom"类。

@Component({
  selector: 'home',
  templateUrl: './app/components/home/home.html',
  styleUrls: ['./app/components/home/home.css']
})
export class Home extends MyCustom {
}

我的目的是获取扩展的所有类的元数据" MyCustom"使用以下方法调用类。

let annotations = Reflect.getMetadata('annotations', MyCustom);

对方法Reflect.getMetadata()的评论说,

  

获取目标上提供的元数据键的元数据值   对象或其原​​型链。

然而我一无所获。如果我将@Component添加到" MyCustom"如下所示,

@Component({
  selector: 'hello'
})
export class MyCustom {}

我得到一个结果,即" MyCustom"上的注释。

为什么我没有获得子类的注释?任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

元数据保存为log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss, SSS} %-5p [%c] - %m%n log4j.rootLogger = info, stdout log4j.logger.org.hibernate = info #following parameters will be used to log the sql parameters log4j.logger.org.hibernate.SQL=debug log4j.logger.org.hibernate.type.descriptor.sql=trace 而不是Home,并且继承在此处无效。

您可以做的是,拥有自己的装饰器,为父类添加元数据,然后使用所需的值调用MyCustom装饰器。
类似的东西:

Component

我没有对它进行测试,之前没有做过类似的事情,但它应该可以正常工作。

为什么不使用“注册表”?
有这样的事情:

function MyComponent(props: any) {
    return (ctor) => {
        Reflect.defineMetadata('annotations', ctor.prototype.name, ctor.prototype);
        return Component(props)(ctor);
    }
}

@MyComponent({
    selector: 'home',
    templateUrl: './app/components/home/home.html',
    styleUrls: ['./app/components/home/home.css']
})
class Home extends MyCustom {}

然后,对于每个这样的组件注册它:

const REGISTRY: { [name: string]: MyCustom } = {};

注册表和组件不必在同一个文件中,只要您在需要的地方导入它。

然后从主要组件中轻松获得所有这些组件。