1

"noUncheckedIndexedAccess": true在我的tsconfig.json. 切换的重点是在访问之前强制检查索引中的项目是否存在。

我很难用变量键检查对象:

假设我有以下结构:

const items: Record<string, {name: string}> = {
  '123': {
    name: 'asdf'
  }
}

当我尝试使用文字键检查是否存在时,类型缩小工作正常:

if (items['123']) {
  // OK: Compiles no problem
  console.log(items['123'].name)
}

如果我尝试使用变量键检查是否存在,编译器就会开始抱怨。

const id = '123';
if (items[id]) {
  // ERROR: items[id] - Object possibly undefined
  console.log(items[id].name)
}

为什么不能以这种方式检查存在?

我甚至尝试了不同的检查:

if (id in items) {}
if (items.hasOwnProperty(id)) {}
if (typeof items[id] !== 'undefined') {}

那里没有运气。

唯一有效的是

const id = '123';
const item = items[id];
if (item) {
  // OK
  console.log(item.name)
}

不过我觉得有点太啰嗦了。

▶️ TypeScript Playground 中的示例

环境: TypeScript v4.5.4

4

1 回答 1

2

GitHub上有一个问题基本上描述了这种确切的情况:

不能缩小T | 使用 --noUncheckedIndexedAccess 时使用虚假检查未定义到 T

该问题已作为此问题的副本关闭,截至 2022 年 2 月仍处于开放状态:

判别属性类型保护不适用于括号符号

根据对第二个问题和其他相关问题的讨论,这听起来像是一个已知的限制,因为在类型检查器中实现它需要性能开销,例如这里

由于性能原因而被拒绝。因为它应该几乎总是可以写const j = list[i],所以这不应该太麻烦。

鉴于该问题仍然存在,似乎有可能在某个时候重新解决此问题以支持您期望的行为。

于 2022-02-08T14:36:05.010 回答