TypeScript 基本用法
类型声明
TypeScript 代码最明显的特征,就是为 JavaScript 变量加上了类型声明。
let foo:string;上面示例中,变量foo的后面使用冒号,声明了它的类型为string。
类型声明的写法,一律为在标识符后面添加“冒号 + 类型”。函数参数和返回值,也是这样来声明类型。
function toString(num:number):string {
return String(num);
}上面示例中,函数toString()的参数num的类型是number。参数列表的圆括号后面,声明了返回值的类型是string。
注意,变量的值应该与声明的类型一致,如果不一致,TypeScript 就会报错。
// 报错
let foo:string = 123;上面示例中,变量foo的类型是字符串,但是赋值为数值123,TypeScript 就报错了。
另外,TypeScript 规定,变量只有赋值后才能使用,否则就会报错。
let x:number;
console.log(x) // 报错上面示例中,变量x没有赋值就被读取,导致报错。而 JavaScript 允许这种行为,不会报错,没有赋值的变量会返回undefined。
类型推断
类型声明并不是必需的,如果没有,TypeScript 会自己推断类型。
let foo = 123;上面示例中,变量foo并没有类型声明,TypeScript 就会推断它的类型。由于它被赋值为一个数值,因此 TypeScript 推断它的类型为number。
后面,如果变量foo更改为其他类型的值,跟推断的类型不一致,TypeScript 就会报错。
let foo = 123;
foo = 'hello'; // 报错上面示例中,变量foo的类型推断为number,后面赋值为字符串,TypeScript 就报错了。
TypeScript 也可以推断函数的返回值。
function toString(num:number) {
return String(num);
}上面示例中,函数toString()没有声明返回值的类型,但是 TypeScript 推断返回的是字符串。正是因为 TypeScript 的类型推断,所以函数返回值的类型通常是省略不写的。
从这里可以看到,TypeScript 的设计思想是,类型声明是可选的,你可以加,也可以不加。即使不加类型声明,依然是有效的 TypeScript 代码,只是这时不能保证 TypeScript 会正确推断出类型。由于这个原因,所有 JavaScript 代码都是合法的 TypeScript 代码。
这样设计还有一个好处,将以前的 JavaScript 项目改为 TypeScript 项目时,你可以逐步地为老代码添加类型,即使有些代码没有添加,也不会无法运行。
TypeScript 的编译
JavaScript 的运行环境(浏览器和 Node.js)不认识 TypeScript 代码。所以,TypeScript 项目要想运行,必须先转为 JavaScript 代码,这个代码转换的过程就叫做“编译”(compile)。
TypeScript 官方没有做运行环境,只提供编译器。编译时,会将类型声明和类型相关的代码全部删除,只留下能运行的 JavaScript 代码,并且不会改变 JavaScript 的运行结果。
因此,TypeScript 的类型检查只是编译时的类型检查,而不是运行时的类型检查。一旦代码编译为 JavaScript,运行时就不再检查类型了。