Inheritance Angular2继承派生类中的修饰符

Inheritance Angular2继承派生类中的修饰符,inheritance,angular,Inheritance,Angular,我设置了带有模板的BaseComponent。我想在扩展base one的组件中使用相同的HTML模板。我知道Angular2中的类继承仅适用于类,而不适用于装饰器。所以看起来我需要一个新的decorator,它将查找父类及其所有decorator并应用于当前类。装饰器的某些属性应该可以更改(如@Component的选择器)。您可以创建自己的组件,利用其父类中的组件元数据创建并注册组件元数据 诸如此类: export function CustomComponent(annotation: an

我设置了带有
模板的
BaseComponent
。我想在扩展base one的组件中使用相同的HTML模板。我知道Angular2中的类继承仅适用于类,而不适用于装饰器。所以看起来我需要一个新的decorator,它将查找父类及其所有decorator并应用于当前类。装饰器的某些属性应该可以更改(如
@Component
选择器
)。

您可以创建自己的组件,利用其父类中的组件元数据创建并注册组件元数据

诸如此类:

export function CustomComponent(annotation: any) {
  return function (target: Function) {
    var parentTarget = Object.getPrototypeOf(target.prototype).constructor;
    var parentAnnotations = Reflect.getMetadata('annotations', parentTarget);

    var parentAnnotation = parentAnnotations[0];
    Object.keys(parentAnnotation).forEach(key => {
      if (isPresent(parentAnnotation[key])) {
        annotation[key] = parentAnnotation[key];
      }
    });
    var metadata = new ComponentMetadata(annotation);

    Reflect.defineMetadata('annotations', [ metadata ], target);
  }
}
您可以这样使用它:

@Component({
  template: `
    (...)
  `
})
export class ParentComponent {
}

@CustomComponent({
  selector: 'test'
})
export class ChildComponent extends ParentComponent {
}
有关更多详细信息,请参见此问题:


另请参见我使用角度βrc1
ComponentMetadata
Reflect.getMetadata()
isPresent()
Reflect.defineMetadata()
未知。我应该进口什么?