# any 类型
在本教程中,你将学习 TypeScript 中的 any 类型,以及如何在代码中正确地使用它。
# TypeScript 中地 any 类型介绍
有时候你需要在变量中存储一个值,但在你编写代码的时候你并不知道它的类型,这种未知的值可能来自第三方的 API 或者用户的输入。在这种情况下,如果你希望不进行类型检查,允许它在编译时通过检查,你可以使用 any 类型, any 类型允许你给变量赋任何类型的值:
// json may come from a third-party API
const json = `{"latitude": 10.11, "longitude":12.12}`;
// parse JSON to find location
const currentLocation = JSON.parse(json);
console.log(currentLocation);
2
3
4
5
6
输出:
{ latitude: 10.11, longitude: 12.12 }
在这个例子中,JSON.parse() 函数返回的对象赋值给了 currentLocation 变量。当你访问 currentLocation 变量的属性的时候,TypeScript 不会做任何的类型检查:
console.log(currentLocation.x);
输出:
undefined;
上面的例子中,TypeScript 编译器不会抛出任何的错误提示。
TypeScript 的 any 类型提供了一个可以与当前基于 JavaScript 的代码库一起正常工作的方案,它允许你在编译期间是否使用类型检测。因此,你可以借助 any 类型把基于 JavaScript 的项目平滑地过渡成为基于 TypeScript 的项目。
# TypeScript 隐式具有 any 类型
如果你在声明一个变量的时候没有指定类型,TypeScript 会假定变量使用的是 any 类型。这个特性被叫做 类型推断。TypeScript 基本上都会进行变量类型的推断,比如:
let result;
在这个例子中,TypeScript 会进行变量的类型推断,这种特性被称为隐式类型。
注意:要禁用
any类型的隐式类型特性,你需要把tsconfig.json文件中的noImplicitAny选项的值调整为true,你在后面的教程中会学习更多关于tsconfig.json配置文件的知识。
# TypeScript 中的 any 类型 vs 对象类型
let result: any;
result = 10.123;
console.log(result.toFixed());
result.willExist(); //
2
3
4
在这个例子中,result 变量的类型为 any类型,那么即使 willExist() 方法在编译时不存在,调用这个方法的时候 TypeScript 编译器也不会发出抛出任何的错误提示,因为 willExist() 函数可能在运行时是可用的。然而,如果把 result 变量的类型修改为 object 类型,TypeScript 编译器会抛出错误提示:
let result: object;
result = 10.123;
result.toFixed();
2
3
错误提示:
error TS2339: Property 'toFixed' does not exist on type 'object'.
# 小结
- TypeScript any类型允许你存储任意类型的值,它告诉编译器不进行类型检查;
- 使用 any类型来存储在编译时或者 JavaScript 项目迁移成 TypeScript 项目时不知道类型的值。