【问题标题】:Readonly observable in TypescriptTypescript 中的只读可观察对象
【发布时间】:2017-05-26 05:41:39
【问题描述】:

我正在使用带有 knockout.js 的 typescript。对于一种情况,我的班级需要不可变字段。该字段应该是可观察的。

我已经创建了

readonly _isDirty = ko.observable<boolean>(false);

在构造函数中赋值

constructor(data: ITypedInput, isDirty: any) {
    super(ko.unwrap(data));
    this._isDirty = isDirty;
}

但是当我想设置另一个值时

this._isDirty(true);

TypeScript 编译器没有说什么,这是不允许的。 在另一种情况下,当我只是设置值时

this._isDirty = true;

编译器说

赋值表达式的左侧不能是常量或只读属性。

那么有什么办法可以让 readonly observable?

谢谢。

【问题讨论】:

  • 创建一个没有write 回调的computedObservable 会解决您的目的吗?因为正如 Nitzan 所提到的,observable 只是一个 function,它通过参数调用以更新其值,而要读取当前值,您只需在不带参数的情况下调用它`
  • 拥有一个readonly observable 有点自相矛盾......创建一个 observable 背后的要点是您可以更改它并且自动更新。如果你不想改变它,你还不如使用“just”一个readonly布尔值:当你applyBindings时,普通值可以很好地工作。

标签: javascript typescript knockout.js observable readonly


【解决方案1】:

只读表示不能改变变量的引用,不代表不能改变对象本身。

例如:

class A {
    public readonly arr: any[] = [];
}

let a = new A();
a.arr = []; // error Cannot assign to 'arr' because it is a constant or a read-only property
a.arr.push(4); // fine

如果this._isDirty 是一个函数,那么即使属性设置为readonly,您也可以调用它。

【讨论】:

  • 所以,答案是否定的,我不能让 observable 不可变?
  • 您可以,但这仅意味着您不能将另一个可观察实例分配给同一个实例。但是不,你不能防止改变可观察状态。您可以创建自己的 observable 来做到这一点
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 2010-10-07
  • 2019-01-30
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多