【发布时间】:2022-02-16 21:13:01
【问题描述】:
Flow 具有 $ReadOnly 实用程序类型 [1],它表示 T 的只读视图。不幸的是,由于 Flow 允许将可变 T 分配给其只读版本,它不能用于模拟 @987654322 的用法@。特别是,它无法检测到对后者的丢失呼叫。例如,给定
type Foo = { field: string };
// frozen is assumed to be immutable with no way to change it
type WithFrozenFoo = { +frozen: $ReadOnly<Foo> }
流类型检查以下代码:
let foo = { field: "test" };
foo.field = "new value";
let bar = { frozen: foo };
...
foo.field = "changed"; // Also changes bar.frozen.field
正确的代码应该是:
let foo = { field: "test" };
foo.field = "new value";
let bar = { frozen: Object.freeze(foo) };
...
foo = { ...foo, field: "changed" }
理想情况下,Flow 应该提供一个单独的 $Frozen,它只能通过 Object.freeze() 从 T 分配实例。
但鉴于缺乏这一点,是否有可能以不同的方式对其进行建模,即使这会涉及到一个在内部使用任何功能的实用函数?
[1] - https://flow.org/en/docs/types/utilities/#toc-readonly
【问题讨论】:
标签: flowtype