通过装饰器添加功能

时间:2016-07-05 09:47:57

标签: javascript typescript decorator

是否有通过装饰器添加功能的有效方法?

装饰:

function testDecorator(options){
    return function(target){
        target.test = function() {
            console.log('Zipp Zapp!');
        };
    }
}

类别:

@testDecorator({})
class Book{

}

用法(在这种情况下是首选),如

Book.test()

打字稿编译结果如下:

Property 'test' does not exist on type 'typeof Book'.

用法如

var b = new Book();
b.test();

打字稿编译结果如下:

Property 'test' does not exist on type 'Book'

1 个答案:

答案 0 :(得分:1)

那是因为您的Book类/实例没有此test函数的定义。

您可以为Book.test版本执行此操作:

function testDecorator(options) {
    return function(target) {
        target.test = function() {
            console.log('Zipp Zapp!');
        };
    }
}

interface BookConstructor {
    new (): Book;
    test(): void;
}

@testDecorator({})
class Book {}

(Book as BookConstructor).test();

code in playground

new Book().test版本:

function testDecorator(options) {
    return function(target) {
        target.prototype.test = function() {
            console.log('Zipp Zapp!');
        };
    }
}

interface Testable {
    test(): void;
}

@testDecorator({})
class Book {}

let b = new Book();
(b as Testable).test();

code in playground

这里的主要区别在于我们正在做的事情:

target.prototype.test = function() { ... }

而不是:

target.test = function() { ... }

在这两种情况下,你都需要进行强制转换,因为Book对象/类没有声明实例/静态方法test,但它是由装饰器添加的。