docs(any): fix #8

This commit is contained in:
ruanyf
2023-08-09 16:48:59 +08:00
parent 7a11026e98
commit 4d13768236
2 changed files with 29 additions and 1 deletions

View File

@@ -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`类型除了关闭类型检查,还有一个很大的问题,就是它会“污染”其他变量。它可以赋值给其他任何类型的变量(因为没有类型检查),导致其他变量出错。

View File

@@ -80,7 +80,7 @@ delete y.foo; // 报错
y.bar = 2; // 报错
```
上面示例中,例一的报错是因为变量一旦赋值了,就不允许再改变类型,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
上面示例中,例一的报错是因为变量赋值时TypeScript 已经推断确定了类型,后面就不允许再赋值为其他类型的值,即变量的类型是静态的。例二的报错是因为对象的属性也是静态的,不允许随意增删。
TypeScript 的作用,就是为 JavaScript 引入这种静态类型特征。