是否有通过装饰器添加功能的有效方法?
装饰:
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'
答案 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();
或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();
这里的主要区别在于我们正在做的事情:
target.prototype.test = function() { ... }
而不是:
target.test = function() { ... }
在这两种情况下,你都需要进行强制转换,因为Book对象/类没有声明实例/静态方法test
,但它是由装饰器添加的。