Mir*_*nas 5 javascript typescript
被Object.freeze建议在打字稿或有确保对象保持不变的其他方式?
由于const只有守卫实例,而不是属性,这显然不是我正在寻找的答案.
Gib*_*olt 20
as const这代表了所有级别的对象或数组的不变性的深度冻结。
const a = {
b: 1,
c: {d: 'e'},
f: ['g', 'h'],
} as const
Run Code Online (Sandbox Code Playgroud)
这些都不允许覆盖
a = 'not'
a.b = 'going'
a.c.d = 'to'
a.f[1] = 'change'
All result in error "TS2540: Cannot assign to '<name>' because it is a read-only property."
Run Code Online (Sandbox Code Playgroud)
注意:自定义对象可能不是完全不可变的,具体取决于您的实现。
奖励:如果用作枚举替换,您可以添加此行
type a = typeof a[keyof typeof a]
Run Code Online (Sandbox Code Playgroud)
Immutable<>as const这与深度冻结参数的作用相同
// Add this and make it reuseable
type Immutable<T> = {
readonly [K in keyof T]: Immutable<T[K]>
}
Run Code Online (Sandbox Code Playgroud)
在 中定义类型<>,即Immutable<MyType>
_method = (a: Immutable<{b:{c:{d:[string]}}}>) => {
// This will complain
a.b.c.d[0] = ""
}
Run Code Online (Sandbox Code Playgroud)
art*_*tem 14
还有其他方法可以确保对象保持不变吗?
这取决于您想要的保险水平.
如果你想确保没有消费者,无论是打字稿还是javascript代码,都可以在运行时修改对象属性,Object.freeze是这样做的方法.
如果编译时检查足够,例如,当所有使用者代码都保证仅仅是打字稿并进行ReadOnly类型检查时,您可以使用 泛型类型,它采用对象类型并生成所有属性readonly.实际上,Object.freeze()在库类型定义中声明ReadOnly为其参数的返回修改类型:
freeze<T>(o: T): Readonly<T>;
Run Code Online (Sandbox Code Playgroud)
为seal,没有办法来表示类型系统密封物体,Object.seal()被声明为返回它接收的相同类型:
seal<T>(o: T): T;
Run Code Online (Sandbox Code Playgroud)
并且Object.seal()是唯一的出路.
| 归档时间: |
|
| 查看次数: |
3029 次 |
| 最近记录: |