首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >还有另一个“对象可能是‘未定义’”,但它真的不可能是

还有另一个“对象可能是‘未定义’”,但它真的不可能是
EN

Stack Overflow用户
提问于 2020-04-21 20:24:23
回答 2查看 57关注 0票数 1

TS用下面的代码报告了一个经典的"Object可能是‘未定义的’“错误,但是这个值不可能是未定义的。是什么导致了这个错误被报告?指向描述此行为的文档的链接将是很棒的!

代码语言:javascript
运行
复制
const maybeTrue = Math.random() < 0.5;

let myStr;

if (maybeTrue) {
  myStr = 'abc';
}

if (maybeTrue) {
  console.log(myStr.toLowerCase()); // Error here, `myStr` possibly undefined
}

操场链接

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-21 20:47:21

TypeScript编译器对代码进行静态分析。这种分析表明,读取myStr值的语句可以通过初始化myStr的代码路径(当第一个if的条件是true)或跳过初始化的代码路径来达到。

编译器不运行代码,它不计算条件,它没有“注意”两个if语句使用相同的条件。

对于分析而言,这两个if看起来都类似于if (<condition>) { <statements> }。重要的是,<statements>并不是在所有代码路径上执行的,因此在第一个if语句myStr可能被初始化之后,也可能不会被初始化。

票数 1
EN

Stack Overflow用户

发布于 2020-04-21 20:50:12

就像在操场剧本里看到的那样。报告的错误在let声明变量的方式上是明确的,但是它没有初始化,所以它是undefined

然后从条件句中的赋值中推断字符串类型。

我不相信类型记录编译器可以推断在第二个条件中,变量是初始化的,是一个字符串。我看到了一些与GitHub相关的问题,很遗憾我找不到任何链接。

但我们可以在你提供的操场上测试它:

  • 如果我们将变量初始化为空字符串,则错误将消失。
代码语言:javascript
运行
复制
const maybeTrue = Math.random() < 0.5

let myStr = ""
if (maybeTrue) {
  myStr = 'abc'
}

if (maybeTrue) {
  console.log(myStr.toLowerCase())
}
  • 如果将console.log语句移到第一个if,则不会报告错误。
代码语言:javascript
运行
复制
const maybeTrue = Math.random() < 0.5

let myStr = ""
if (maybeTrue) {
  myStr = 'abc'
  console.log(myStr.toLowerCase())
}

在这里查看一下:https://www.typescriptlang.org/docs/handbook/type-inference.htmlhttps://www.typescriptlang.org/docs/handbook/advanced-types.html,以了解如何实现类型的更详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61352579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档