6

不适用于以下代码:

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从装饰器中使用泛型的方法

4

1 回答 1

1

装饰器不能改变类的结构,这个限制是设计使然。我们可以使用 mixins 来实现类的突变,如此处所述。

但是,如果没有更完整的示例,我不确定您为什么不直接使用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

注意您当前的装饰器实现不正确,您分配Decoratedtarget,target是该类而不是该类的实例,因此该类的所有Decorated实例仅存在一个对象,我猜这是为了保持实例状态,因此实现将导致问题。

于 2018-07-09T06:15:28.173 回答