尝试更新对象中的布尔型属性的打字稿收到“ TypeError:无法分配为只读属性”

时间:2018-11-25 17:06:39

标签: javascript typescript

如果我已经定义了对象,如何更改属性的值?我还有其他选择吗?

export interface myTest {
    shouldChange: boolean; // <-- not using readonly
}

const testObj = {
    shouldChange: false
} as myTest;

// later on 
testObj.shouldChange = true // <-- this throws the following error
  

TypeError:无法分配为只读对象'[object Object]'的属性'shouldChange'

2 个答案:

答案 0 :(得分:0)

您可以在此处执行的一种选择是使用[]括号访问属性,并为其指定类型any

export interface myTest {
    shouldChange: boolean; // <-- readonly
}

const testObj = {
    shouldChange: false
} as myTest;


testObj['shouldChange' as any] = true;

答案 1 :(得分:0)

我不确定该代码是否在NGRX上下文中使用,但是无论如何,请考虑尝试以下操作:

testObj = {...testObj};

在NGRX上下文中,您从存储中获取的数据处于冻结状态,并且是只读的。使用此代码(即传播运算符和testObj = Object.Assign({}, testObj)的等效代码),您基本上创建了一个全新的对象,该对象看起来与先前的testObj相同。唯一的区别是,该对象没有冻结状态,可以自由调整。

如果您有更深的物体,并且需要进行调整,则必须使用lodash中的cloneDeep

export interface myTest {
    shouldChange: boolean;
    somethingElse: DeepObject;
}

export class DeepObject {
    index: number;
}

testObj = _.cloneDeep(testObj);
testObj.somethingElse.index = 42; // <-- Does not throw errors