TypeScript不能捕获未定义的变量?

时间:2018-09-24 23:45:58

标签: typescript

我试图更好地理解TypeScript。我发现如果我写这样的错误:

function doStuff() {
    if (physician.email == "george@gmail.com")
    {
         var physician = {email: "bob@gmail.com", name: "Dr. Bob"};
         /* .... */
    } }

在我们尝试使用其属性之一后,TypeScript不会捕获定义了医生对象的问题。这会导致运行时错误:

  

类型错误:无法读取未定义的属性“电子邮件”。

为什么TypeScript编译器不能捕获这样的东西?我相信使用TypeScript 2.0。

1 个答案:

答案 0 :(得分:4)

在JavaScript中,var变量的声明(尽管不是初始化)被隐式移动到包含函数的开头,var变量被隐式初始化为undefined,直到用户-达到书面的初始化程序。默认情况下,TypeScript认为读取隐式undefined值是合法的。一种可能导致错误的方法是启用strictNullChecks编译器选项(或总括strict选项),然后为变量指定一个不包含undefined的类型(该变量将自动发生)。在您的示例中进行推断)。这是该功能的the documentation。 tslint还有一个no-use-before-declare rule应该可以检测到问题。

var变量相反,在声明之前使用letconst变量在TypeScript中始终是编译错误。这是在let上强烈推荐const(或var)的原因之一。 let变量在声明(并隐式初始化为undefined)之后但在用户代码初始化之前的使用,遵循与var相同的规则。