在以下代码下不起作用:
function deco<T>(){
return function(target, key){
// before
// target[key] = new Decorated<T>();
// edited
Object.defineProperty(target, key, {
get(){
return new Decorated<T>();
}
});
}
}
class Decorated<T> {
set(values: T){
}
}
class MyDecos {
@deco<{a: number}>() a;
@deco<{b: string}>() b;
}
const test = new MyDecos;
test.a.set(); // want to throw error
test.a.set({a: '1'); // want to throw error
test.b.set({b: 1); // want to throw error
通用有什么问题吗?
助手显示values: any
我想Test.set
个从装饰器使用Generic的方法
答案 0 :(得分:0)
装饰器无法更改类的结构,此限制是设计使然。如here所述,我们可以使用mixin实现类的突变。
但是,在没有更完整的示例的情况下,我不确定为什么您不只是直接插入Decorated<T>
来使字段无效。在这种情况下,装饰器版本似乎没有添加太多内容:
class MyDecos {
a = new Decorated<{ a: number }>();
b = new Decorated<{ b: string }>();
}
const test = new MyDecos;
test.a.set(); // error
test.a.set({ a: '1'); //error
test.b.set({ b: 1); // error
注意,您当前的装饰器实现不正确,您将Decorated
分配给target
,target
是该类而不是该类的实例,因此仅类的所有实例将存在一个Decorated
对象,我想这是为了保留实例状态,因此实现会引起问题。