我试图更好地理解TypeScript。我发现如果我写这样的错误:
function doStuff() {
if (physician.email == "george@gmail.com")
{
var physician = {email: "bob@gmail.com", name: "Dr. Bob"};
/* .... */
} }
在我们尝试使用其属性之一后,TypeScript不会捕获定义了医生对象的问题。这会导致运行时错误:
类型错误:无法读取未定义的属性“电子邮件”。
为什么TypeScript编译器不能捕获这样的东西?我相信使用TypeScript 2.0。
答案 0 :(得分:4)
在JavaScript中,var
变量的声明(尽管不是初始化)被隐式移动到包含函数的开头,var
变量被隐式初始化为undefined
,直到用户-达到书面的初始化程序。默认情况下,TypeScript认为读取隐式undefined
值是合法的。一种可能导致错误的方法是启用strictNullChecks
编译器选项(或总括strict
选项),然后为变量指定一个不包含undefined
的类型(该变量将自动发生)。在您的示例中进行推断)。这是该功能的the documentation。 tslint还有一个no-use-before-declare
rule应该可以检测到问题。
与var
变量相反,在声明之前使用let
或const
变量在TypeScript中始终是编译错误。这是在let
上强烈推荐const
(或var
)的原因之一。 let
变量在声明(并隐式初始化为undefined
)之后但在用户代码初始化之前的使用,遵循与var
相同的规则。