如何解决有没有一种优雅的方法来只设置一次类属性?
在 TypeScript 中,在类中,是否有一种优雅的方法可以只设置一次值?换句话说,是否有等价的在给它一个值后将一个值设置为readonly
?
例如:
class FooExample {
public fixedValue: string;
public setFixedValue(value: string): void {
if (!this.fixedValue) {
// this value should be immutable
this.fixedValue = value;
}
}
}
我不是在寻找 getter,因为可以在类本身中更改类属性。
解决方法
您可以使用“智能”setter 来实现此目的。这个想法是在类上定义一个 setter,从自身中删除 setter 并通过 Object.defineProperty
方法定义一个只读属性,该方法的 writable
属性设置为 {{1} }.
“在类本身内改变”部分可以通过另一个属性重新定义来实现。首先不要忘记将属性设为 false
。
这里是完整的样子(我认为没有更优雅的方法来做到这一点) - 答案的运行时版本不是 TypeScript 特定的:
configurable
如果您还想从类型系统的角度强制执行此操作,只需将属性设置为 class ReadonlyFields {
set fixed(value) {
Object.defineProperty(this,"fixed",{
value,writable: false,configurable: true,});
}
doSomething() {
Object.defineProperty(this,{
value: 24,//exact logic for changing the value is up to you
writable: false
});
}
}
const r = new ReadonlyFields();
r.fixed = 42;
console.log(r.fixed); //42;
r.fixed = 24;
console.log(r.fixed); //42;
r.doSomething();
console.log(r.fixed); //24;
:
readonly
,
阅读建议的答案并进行自己的研究后,我相信我找到了最优雅的解决方案。您首先将值定义为 Object
,然后在填充相关属性后将 freeze()
定义为 Object
。
class FooExample {
public fixedValue = {
value: '';
};
public setFixedValue(value: string): void {
if (!Object.isFrozen(this.fixedValue)) {
this.fixedValue.value = value;
Object.freeze(this.fixedValue);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。