如何使用类装饰器添加的功能

时间:2015-12-03 07:38:10

标签: typescript decorator

我创建了一个类装饰器,它所做的就是为类

的原型添加一个函数
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();
    }
}

有什么想法吗?或者目前还没有解决方法吗?

2 个答案:

答案 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还有其他解决同样问题的方法。