Angular &引用;x";是只读的,但不是';T

Angular &引用;x";是只读的,但不是';T,angular,typescript,ngrx,Angular,Typescript,Ngrx,我有一个Angular 10(Typescript 3.9)项目,课程如下: export class Document { constructor( public id: number, ... public tags: Tag[] ) { this.id = id; ... this.tags = tags; } } 如果我尝试使用更改标记(重新分配或推送) docume

我有一个Angular 10(Typescript 3.9)项目,课程如下:

export class Document {
    constructor(
        public id: number,
        ...
        public tags: Tag[]
    ) {
        this.id = id;
        ...
        this.tags = tags;
    }
}
如果我尝试使用更改标记(重新分配或推送)

document.tags=

例如,在现有对象中,我得到:

错误类型错误:“标记”是只读的

如果我有一个

只读

我期待这种行为。你知道这个错误是从哪里来的吗

我最近将Angular 7升级到了10,之前一切都很好,但是升级说明中没有提到这种行为

停用严格模式(即使被认为是不好的做法)不起作用


你知道吗?

首先,文件是保留的,尽量不要使用它。并检查下面的示例

class Tst {
    constructor(
        public id: number,
        public tags: number[]
    ) {
        this.id = id;
        this.tags = tags;
    }
}

var x = new Tst(1, [1,2])
x.id = 12
x.tags = [3,4]

以下是根据评论给出的答案

更改ngrx存储对象可能会导致此类行为,因为存储从减速器外部保护要更改的对象

大多数人还额外安装了ngrx store freeze(ngrx商店冻结)来取回保险箱。使用Angular 8,该功能成为内置功能

您可以尝试通过将
strictStateImmutability
设置为
false
来禁用它,但不建议这样做,因为存储现在可能包含不可预测的更改

@NgModule({
  imports: [
    StoreModule.forRoot(reducers, {
      runtimeChecks: {
        strictStateImmutability: false,
      },
    }),
  ],
})
export class AppModule {}

请显示您在该代码中使用的
文档的创建位置和创建方式。(请注意,有一个名为
document
的全局文件。您可能误用了它吗?)。请用一个显示问题的链接更新您的问题,最好是一个操场链接(作为附件),在那里我们可以看到它运行。(旁注:我可能会选择一个不同的名称,因为
文档
是一个预定义的名称。但对其进行阴影处理确实有效。)完整示例?如何导入和实例化类等。您是否在项目中使用存储?尝试更改存储的对象可能会导致这种效果,因为存储会创建只读字段,以确保状态不会从减速器外部更改。是的,大多数人会额外安装
ngrx store freeze
,以检索安全设置。对于Angular 8,此功能是内置的。您可以(但不应该)对
文档进行阴影处理,因此名称不是问题。另一个选项是在对从存储检索到的所有对象进行变异之前展开/复制它们。