我试图更好地理解 TypeScript。我发现如果我写这样的错误:
function doStuff() {
if (physician.email == "george@gmail.com")
{
var physician = {email: "bob@gmail.com", name: "Dr. Bob"};
/* .... */
} }
Run Code Online (Sandbox Code Playgroud)
TypeScript 不会发现在我们尝试使用其属性之一之后定义了医师对象的问题。这会导致运行时错误:
类型错误:无法读取未定义的属性“电子邮件”。
为什么 TypeScript 转译器不捕捉这样的东西?我相信使用 TypeScript 2.0。
在 JavaScript 中,变量的声明(虽然不是初始化)var被隐式移动到包含函数的开头,并且var变量被隐式初始化,undefined直到到达用户编写的初始化程序。默认情况下,TypeScript 认为读取隐式undefined值是合法的。使它成为错误的一种方法是启用strictNullChecks编译器选项(或伞形strict选项)并为变量提供不包含的类型undefined(在您的示例中通过推理自动发生)。这是该功能的文档。tslint 也有一个应该检测问题的no-use-before-declare规则。
与var变量相反,在声明之前使用letorconst变量在 TypeScript 中总是编译错误。这是let(或const)强烈推荐超过var. let在声明(并隐式初始化为undefined)之后但在由用户代码初始化之前使用变量遵循与 相同的规则var。
| 归档时间: |
|
| 查看次数: |
1050 次 |
| 最近记录: |