说服 TypeScript 类型也可以是未定义的

Convincing TypeScript a type can be undefined as well

提问人:kwyntes 提问时间:6/5/2023 更新时间:6/5/2023 访问量:36

问:

必须告诉 TypeScript 某些值肯定存在并且不会存在是很常见的。然而,这几乎从来都不是相反的——不得不说服 TypeScript 相信它实际上对类型的定义性过于自信。undefined

命运多舛,我遇到过一个这样的案例。

const listA = document.querySelector(...);
const listB = document.querySelector(...);

while (listA.children.length > 0 || listB.children.length > 0) {
  const itemA: HTMLElement | undefined = listA.children[0] as any;
  const itemB: HTMLElement | undefined = listB.children[0] as any;

  // ...
}

在此示例中,只要两个列表中至少有一个仍包含元素,循环就会继续。这意味着,如果两个列表中的任何一个是空的,而另一个不是,则 EITHER 或 将是 。然而,TypeScript 似乎无法理解这些事情。它似乎把心思放在了两个变量上,并且拒绝听取任何不这么说的人。whileitemAitemBundefinedHTMLElement

绝望的是,我什至尝试了这条线

const itemA: HTMLElement | undefined = listA.children[0] as any as HTMLElement | undefined;

但这毫无用处。

有没有办法让 TypeScript 承认项目的潜力?undefined

TypeScript 强制 类型转换 未定义

评论

0赞 Chris Heald 6/5/2023
document.querySelector 的返回类型已经是 ,如规范中所定义。你在做什么导致 Typescript 不抱怨 listA 和 listB 可能为 null?请参阅此 Playground 链接Element | null
0赞 merryweather 6/5/2023
启用 noUncheckedIndexedAccess。
0赞 jcalz 6/5/2023
请提供一个最小的可重现示例来演示您的问题,而不演示不相关的问题(例如索引到可能的列表中)。这将有助于我们为您提供帮助,而不会被您不问的事情分心。祝你好运!null
0赞 kwyntes 6/5/2023
@jcalz 我不太确定我在这里提供的内容如何不是一个最小的可重复示例。您是否希望我为两个标签添加 HTML 代码并在调用中引用这些标签?divquerySelector
0赞 kwyntes 6/5/2023
@ChrisHeald啊,你似乎误会了。它不是关于和可能,而是关于和可能存在。listAlistBnullitemAitemBundefined

答: 暂无答案