微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有一种优雅的方法来只设置一次类属性?

如何解决有没有一种优雅的方法来只设置一次类属性?

在 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?