From 4d137682369f113cb4a3c95e2084717d29a8500c Mon Sep 17 00:00:00 2001 From: ruanyf Date: Wed, 9 Aug 2023 16:48:59 +0800 Subject: [PATCH] docs(any): fix #8 --- docs/any.md | 28 ++++++++++++++++++++++++++++ docs/intro.md | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/any.md b/docs/any.md index b8c8b07..ce62426 100644 --- a/docs/any.md +++ b/docs/any.md @@ -65,6 +65,34 @@ $ tsc --noImplicitAny app.ts 上面命令使用了`noImplicitAny`编译选项进行编译,这时上面的函数`add()`就会报错。 +这里有一个特殊情况,即使打开了`noImplicitAny`,使用`let`和`var`命令声明变量,但不赋值也不指定类型,是不会报错的。 + +```typescript +var x; // 不报错 +let y; // 不报错 +``` + +上面示例中,变量`x`和`y`声明时没有赋值,也没有指定类型,TypeScript 会推断它们的类型为`any`。这时即使打开了`noImplicitAny`,也不会报错。 + +```typescript +let x; + +x = 123; +x = { foo: 'hello' }; +``` + +上面示例中,变量`x`的类型推断为`any`,但是不报错,可以顺利通过编译。 + +由于这个原因,建议使用`let`和`var`声明变量时,如果不赋值,就一定要显式声明类型,否则可能存在安全隐患。 + +`const`命令没有这个问题,因为 TypeScript 要求`const`声明变量时,必须同时进行初始化(赋值)。 + +```typescript +const x; // 报错 +``` + +上面示例中,`const`命令声明的`x`是不能改变值的,声明时必须同时赋值,否则报错,所以它不存在类型推断为`any`的问题。 + ### 污染问题 `any`类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。 diff --git a/docs/intro.md b/docs/intro.md index ceacc09..bb965c6 100644 --- a/docs/intro.md +++ b/docs/intro.md @@ -80,7 +80,7 @@ delete y.foo; // 报错 y.bar = 2; // 报错 ``` -上面示例中,例一的报错是因为变量一旦赋值了,就不允许再改变类型,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。 +上面示例中,例一的报错是因为变量赋值时,TypeScript 已经推断确定了类型,后面就不允许再赋值为其他类型的值,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。 TypeScript 的作用,就是为 JavaScript 引入这种静态类型特征。