TS用下面的代码报告了一个经典的"Object可能是‘未定义的’“错误,但是这个值不可能是未定义的。是什么导致了这个错误被报告?指向描述此行为的文档的链接将是很棒的!
const maybeTrue = Math.random() < 0.5;
let myStr;
if (maybeTrue) {
myStr = 'abc';
}
if (maybeTrue) {
console.log(myStr.toLowerCase()); // Error here, `myStr` possibly undefined
}发布于 2020-04-21 20:47:21
TypeScript编译器对代码进行静态分析。这种分析表明,读取myStr值的语句可以通过初始化myStr的代码路径(当第一个if的条件是true)或跳过初始化的代码路径来达到。
编译器不运行代码,它不计算条件,它没有“注意”两个if语句使用相同的条件。
对于分析而言,这两个if看起来都类似于if (<condition>) { <statements> }。重要的是,<statements>并不是在所有代码路径上执行的,因此在第一个if语句myStr可能被初始化之后,也可能不会被初始化。
发布于 2020-04-21 20:50:12
就像在操场剧本里看到的那样。报告的错误在let声明变量的方式上是明确的,但是它没有初始化,所以它是undefined。
然后从条件句中的赋值中推断字符串类型。
我不相信类型记录编译器可以推断在第二个条件中,变量是初始化的,是一个字符串。我看到了一些与GitHub相关的问题,很遗憾我找不到任何链接。
但我们可以在你提供的操场上测试它:
const maybeTrue = Math.random() < 0.5
let myStr = ""
if (maybeTrue) {
myStr = 'abc'
}
if (maybeTrue) {
console.log(myStr.toLowerCase())
}console.log语句移到第一个if,则不会报告错误。const maybeTrue = Math.random() < 0.5
let myStr = ""
if (maybeTrue) {
myStr = 'abc'
console.log(myStr.toLowerCase())
}在这里查看一下:https://www.typescriptlang.org/docs/handbook/type-inference.html和https://www.typescriptlang.org/docs/handbook/advanced-types.html,以了解如何实现类型的更详细信息。
https://stackoverflow.com/questions/61352579
复制相似问题