TypeScript不';捕获未定义的变量?
我正在努力更好地理解打字稿。我发现如果我写这样一个bug:TypeScript不';捕获未定义的变量?,typescript,Typescript,我正在努力更好地理解打字稿。我发现如果我写这样一个bug: function doStuff() { if (physician.email == "george@gmail.com") { var physician = {email: "bob@gmail.com", name: "Dr. Bob"}; /* .... */ } } TypeScript不会发现在我们尝试使用其属性之一后定义了Medical对象的问题。这将导致以下
function doStuff() {
if (physician.email == "george@gmail.com")
{
var physician = {email: "bob@gmail.com", name: "Dr. Bob"};
/* .... */
} }
TypeScript不会发现在我们尝试使用其属性之一后定义了Medical对象的问题。这将导致以下运行时错误:
类型错误:无法读取未定义的属性“email”
为什么TypeScript transpiler不能捕获这样的内容?我相信使用TypeScript 2.0。在JavaScript中,
var
变量的声明(尽管不是初始化)被隐式移动到包含函数的开头,并且var
变量被隐式初始化为未定义的,直到到达用户编写的初始值设定项为止。默认情况下,TypeScript的位置是读取隐式未定义的值是合法的。使其成为错误的一种方法是启用strictNullChecks
编译器选项(或伞形strict
选项),并为变量指定一种不包含未定义的
的类型(在您的示例中,通过推理自动发生)。以下是该功能的详细信息。tslint还有一个可以检测问题的方法
与var
变量不同,在声明变量之前使用let
或const
变量在TypeScript中总是一个编译错误。这就是强烈建议let
(或const
)优于var
的原因之一。声明变量之后(隐式初始化为未定义的),但在用户代码初始化变量之前,使用let
变量遵循与var
相同的规则。注意:这是避免使用var
的一个原因。如果在声明变量之前不能使用它,那么很难意外地导致这样的错误。