【问题标题】:Update to typescript 3.8, made array readonly更新到 typescript 3.8,使数组只读
【发布时间】:2020-05-28 12:14:10
【问题描述】:

我最近将我的项目从 Typescript 3.5 更新到 3.8。 一切运行顺利,期待对数组进行一些操作。

    const usedROI = this.rois.find((roi) => roi.id === roiId);
    usedROI.position.height = position.height;

错误类型错误:无法分配给对象“[object Object]”的只读属性“height”

   let rerouteWaypoint = route.waypoints.filter((wp) => wp.type === IWaypointType.REROUTE_POINT);
   rerouteWaypoint.forEach((wp) => (wp.type = IWaypointType.USER_POINT));

错误类型错误:无法分配给对象“[对象数组]”的只读属性“类型”

  const wps = state.entities[action.payload.routeId].waypoints;
  const wp = {
    ...wps[index],
    ...action.payload.changes,
  };
  wps[index] = { ...wp }; <= this line breaks

core.js:4117 ERROR TypeError: 无法分配给对象“[object Array]”的只读属性“0”

我没有在我的应用程序的任何地方使用只读,看起来我的所有数组都被冻结且不可编辑。

为什么会这样?我在重大变化中看不到它。有没有办法在视觉代码中找到发生此问题的所有位置?因为现在只在运行时弹出错误,部署这样的版本真的很不安全。

编辑:有人在这里谈论类似的问题 => Error while sorting array of objects Cannot assign to read only property '2' of object '[object Array]'

但我不明白为什么简单的数组也会在没有使用 redux 存储元素的情况下抛出它。

【问题讨论】:

  • 由于这是一个运行时错误,而不是编译时错误,听起来这与您在更新 TypeScript 的同时更新的 else 内容有关。您从中获取对象的东西已经密封或冻结了它不习惯的对象(可能是因为它们总是应该是只读的,但它的早期版本并没有强制执行)。
  • “有没有办法在可视代码中找到所有出现此问题的位置?” 是的。一旦您知道哪些对象被密封或冻结,您就可以更新您正在使用的类型信息,以说明它们的属性是只读的。然后 TypeScript 将捕获您分配给它们的任何位置。 (前提是您没有使用类型断言或any 等来选择退出 TypeScript 的输入位置。)
  • 我会调查一下谢谢
  • 看起来所有抛出错误的东西都与ngrx有些关联,就像我从选择器中得到的值一样。但没有办法将它们键入为只读
  • @T.J.Crowder 我发现了,谢谢你的帮助

标签: typescript


【解决方案1】:

@T.J.Crowder 评论之后,我查看了我的代码,默认情况下,如果未在 NGRX 中键入选择器,则返回的值不是只读类型。

export const getSelectedProjectId = (state: State): Readonly<number> => state.selectedProjectId;
export const getError = (state: State): Readonly<string> => state.error;
export const getIsLoading = (state: State): Readonly<boolean> => state.isLoading;

export const selectAll: (state: object) => ReadonlyArray<IProject> = featureAdapter.getSelectors(selectProjectState).selectAll;
export const selectAllEntities: (state: object) => Dictionary<IProject> = featureAdapter.getSelectors(
  selectProjectState
).selectEntities;

这触发了打字稿中的所有错误,然后我修复了它们并修复了项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多