我创建了一个类装饰器,它所做的就是为类
的原型添加一个函数export function myDecorator(target: any): any {
'use strict';
var original = target;
function construct(constructor, args) {
var c: any = function () {
return constructor.apply(this, args);
};
c.prototype = constructor.prototype;
return new c();
}
var f: any = function (...args) {
return construct(original, args);
};
f.prototype = original.prototype;
f.prototype.decoratedFunction = function() {
// decorated function body
};
return f;}
但..当我装饰一个类时,装饰函数无法解析,因而无法编译。
@myDecorator
class MyClass {
constructor() {
this.decoratedFunction();
}
}
有什么想法吗?或者目前还没有解决方法吗?
答案 0 :(得分:0)
您可以使用此功能的方法是:
1)在课堂上声明:
@myDecorator
class MyClass {
constructor() {
this.decoratedFunction();
}
decoratedFunction: () => void;
}
2)使用方括号:
this["decoratedFunction"]();
答案 1 :(得分:0)
没有办法让装饰器添加的功能在打字稿中输入和“可用”。原因是该函数只在运行时添加(在javascript而不是打字稿代码中)。
正如本已经指出的那样,使其工作的唯一方法是添加存根或使用括号表示法。这似乎是装饰器的坏用法,它们应该用于添加类不明确需要的功能。例如,注入,验证或调试日志记录。
您想要做的事情对于班级的运作方式至关重要。如果你删除了装饰器,那么类会抛出一个错误,因为在类中调用了添加的方法,这在我看来应该不是这样的。
一个简单的基类应该为你解决问题,干净整洁:
abstract class MyBaseClass {
protected decoratedFunction() {
// do some magic..
}
}
class MyClass extends MyBaseClass {
constructor() {
this.decoratedFunction();
}
}
其他解决方案可能是使用decorator pattern,如下所示:
class SomeClass {
// ...
}
class DecoratedClass extends SomeClass {
constructor() {
super();
this.decoratedFunction();
}
private decoratedFunction() {
// Do some magic....
}
}
或使用合成(composition over inheritance)添加功能:
class ClassWithMagic {
public decoratedFunction() {
// Do some magic...
}
}
class SomeClass {
private compositionInstance = new ClassWithMagic();
constructor() {
this.compositionInstance.decoratedFunction();
}
}
希望这有帮助。装饰器似乎不是解决问题的正确方法,但oop还有其他解决同样问题的方法。