假设我有一个指令修饰符,它将一个静态方法添加到它称为工厂的目标:

function Directive<T extends { new (...args: any[]): {} }>(constructor: T) {
  return class extends constructor {
    static factory(...args): ng.IDirectiveFactory {
      const c: any = () => {
        return constructor.apply(this, args);
      };
      c.prototype = constructor.prototype;
      return new c(...args);
    }
  };
}

我还通过一个接口添加类型:
interface BaseDirective extends ng.IDirective {
  factory(): ng.IDirectiveFactory;
}

为什么在我班上声明:
@Directive
class FocusedDirective implements BaseDirective {....

我得到一个Class 'FocusedDirective' incorrectly implements interface 'BaseDirective'. Property 'factory' is missing in type 'FocusedDirective'.
希望@Directive为我添加此缺少的属性是错误的吗?

最佳答案

装饰器不能更改类的类型,可以调用函数作为函数,并存储包含该方法的新类,并使用新类代替原来的类:

 const FocusedDirectiveWithDirective = Directive(FocusedDirective);

通过使用类表达式,可以完全消除中间类:
const FocusedDirective = Directive(class implements BaseDirective{

});

09-26 07:30