【问题标题】:Asserting NGRX Dictionary value is defined断言 NGRX 字典值已定义
【发布时间】:2019-12-09 13:11:51
【问题描述】:

我刚刚从 Angular 7.1.4 升级到 8.2.0,Typescript 3.1.6 升级到 3.5.3,RxJS

在升级之前,TS 正确地识别出这个数组项不是未定义的,但是现在我得到了这个令人沮丧的编译错误。 (注意,我在下面使用 lo-dash,但是如果我使用 if (autoCorrectionData[action.algorithmId] !== undefined) {,也会出现同样的错误

src/app/state/edit/edit.reducer.ts(417,29): error TS2532: Object is possibly 'undefined'.

在我使用if 条件检查后,如何让 TypeScript 识别对象已定义?

*edit* 这可能与最近对 NGRX 词典的更改有关,但我不知道为什么。字典值现在可以是未定义的。

【问题讨论】:

  • 看来 TS 3.5 编译器需要指定对象的类型或使其明确。尝试以下操作:const acd = autoCorrectionData as anyconst acd = autoCorrectionData as Array<any> [或您的类型],然后按照 acd 更改您的代码。
  • 在这种情况下,autoCorrectionData 已经输入为Dictionary<IAutoCorrectionDataForRegion>
  • 我想我可以做的是使用非空断言运算符! 手动断言数据已定义。不过,这不应该是必要的。 TS 之前很聪明,早就想通了,所以一定有办法。

标签: angular typescript ngrx rxjs6 ngrx-entity


【解决方案1】:

对代码的这种更改消除了错误,但是……为什么需要这样做?

一位同事建议这可能与最近对 rxjs Dictionary 的更改有关,该更改指定现在可以未定义值,但这似乎很愚蠢。

【讨论】:

  • 由于某种原因,TypeScript 仅支持根对象的类型缩小。当它必须取消引用一个对象(索引、属性、方法等)时,类型缩小(比如认识到 undefined 已从联合中删除)不再有效,它假定完整的联合。因此,将一个复杂的引用重构为一个简单的局部变量,用于nullundefined 检查,或任何类型保护,是很常见的。
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
相关资源
最近更新 更多