如何在枚举上创建代理?

时间:2018-04-04 15:42:27

标签: javascript typescript enums

我有一个enum我想设置Proxy,但是当我尝试设置this.status的值时,没有任何反应。我希望I have been set能够输出到控制台,但这并不会发生。为什么代理不能使用枚举?

export enum Status { Beginning, Middle, Ending }

export class MyClass {
  public status = new Proxy(Status, {
    set: (target, propertyKey, value) = {
      console.log('I have been set')
      return Reflect.set(target, propertyKey, value)
    },
    get: (target, propertyKey) => Reflect.get(target, propertyKey)
  })
}

用法:

let c = new MyClass
c.status = Status.Middle

当我尝试设置它时,我收到以下错误:

  

键入' Status.Middle'不能分配类型' typeof Status'。

1 个答案:

答案 0 :(得分:2)

我打算走出困境并建议您实际上不需要Proxy,而status代替MyClass export enum Status { Beginning, Middle, Ending } export class MyClass { private target: Status = Status.Beginning; public get status(): Status { return this.target; } public set status(status: Status) { console.log("I have been set"); this.target = status; } } let c = new MyClass(); c.status = Status.Middle; // logs "I have been set". 属性。像这样:

status

问题:如果您想拦截MyClass的{​​{1}}属性上的获取和设置,那么您需要在MyClass上执行“类似代理”的行为,而不是在Status。如果你只是试图拦截一个已知属性的获取和设置,那么一个完整的代理是过度的,因为当propertyKey等于status时你只会做一些特殊的事情。 。访问器专门用于包装单个属性。

好的,希望有所帮助。祝好运!

如果private对你不够好,你可以这样做:

export class MyClass {
  status!: Status; // status will be defined in the constructor

  constructor() {
    let target = Status.Beginning;
    Object.defineProperty(this, 'status', {
      get() { return target; },
      set(status: Status) {
        console.log("I have been set");
        target = status;
      }
    })
  }
}

let c = new MyClass();
c.status = Status.Middle;
// logs "I have been set".

隐藏了基础target的封闭,外部世界完全无法访问。但请注意,您实际上是在MyClass的每个实例上创建一个“自己的”访问器,而不是MyClass原型上的一个访问器。如果重要的话,这取决于你。

祝你好运。