typescript - 我想要 TS 中完全不可变的对象

标签 typescript typescript2.0

我有一些大对象,比如

const a={
 b:33, 
 c:[78, 99], 
 d:{e:{f:{g:true, h:{boom:'selecta'}}}};/// well, even deeper than this...

我希望 TS 允许我这样做

a.d.e.f.h.boom='respek';

如何完全改变对象?是否仅通过为每个深度嵌套对象创建具有“只读”接口(interface)和接口(interface)?

最佳答案

我们现在有选项 as const,这是 @phil294 提到的第一个选项(嵌套 readonly)的语法简洁方式。

const a = {
    b: 33,
    c: [78, 99],
    d:{e:{f:{g:true, h:{boom:'selecta'}}}}
} as const;

a.d.e.f.h.boom = 'respek'; //Cannot assign to 'boom' because it is a read-only property.ts(2540)

作为额外的好处,您可以使用此技巧将输入设置为不可变的嵌套函数:

type Immutable<T> = {
    readonly [K in keyof T]: Immutable<T[K]>;
}

所以这会发生

const a = {
    b: 33,
    c: [78, 99],
    d:{e:{f:{g:true, h:{boom:'selecta'}}}}
}

function mutateImmutable(input: Immutable<typeof a>) {
    input.d.e.f.h.boom = 'respek'; //Cannot assign to 'boom' because it is a read-only property.ts(2540)
}

关于typescript - 我想要 TS 中完全不可变的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120022/

相关文章:

css - 如何将预先存在的 css 类附加到 Cytoscape JS for Angular 中的节点标签

javascript - API 调用时的 Angular 定位控制台错误

javascript - TypeScript:要求两个数组的长度相同?

reactjs - 在命名空间 Typescript 项目中使用 NPM 模块

typescript - 为什么要求抽象类完全实现命名接口(interface)?

angular - 用尽 RxJs retryWhen 运算符尝试后如何抛出异常?

typescript - 在 TypeScript 中选择并展平类型签名

typescript - 在 TypeScript 接口(interface)中使用字符串枚举值作为计算属性键

reactjs - Typescript React 空函数作为 defaultProps

javascript - 如何比较两个数组并通过完整迭代删除重复对象