带有通用类型的 Typescript 装饰器
Typescript Decorator with Generic Type
以下代码无效:
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
方法使用装饰器中的泛型
装饰器无法更改 class 的结构,此限制是设计使然。我们可以使用 mixin 来实现 class 的变异,如 here.
所述
然而,如果没有更完整的示例,我不确定您为什么不直接使用 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
注意你现在的装饰器实现不ok,你把Decorated
赋给了target
,target
就是class 不是 class 的实例,因此对于 class 的 所有 个实例,只有一个 Decorated
对象存在,我猜这是为了保持实例状态所以执行会出现问题。
以下代码无效:
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
方法使用装饰器中的泛型
装饰器无法更改 class 的结构,此限制是设计使然。我们可以使用 mixin 来实现 class 的变异,如 here.
所述然而,如果没有更完整的示例,我不确定您为什么不直接使用 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
注意你现在的装饰器实现不ok,你把Decorated
赋给了target
,target
就是class 不是 class 的实例,因此对于 class 的 所有 个实例,只有一个 Decorated
对象存在,我猜这是为了保持实例状态所以执行会出现问题。