我有一个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'。
答案 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
原型上的一个访问器。如果重要的话,这取决于你。
祝你好运。