相信你在写JavaScript代码的时候也碰到过很头疼的时刻,好比对象的属性名或方法名大小写错了,或是记不得某个对象有没有某个属性,惧怕最新的ES标准有的浏览器尚未支持...等等种种问题,那么你须要使用TypeScript,你会爱上她的(●'◡'●)。git
TypeScript是JavaScript的超级,她是静态类型检查的github
这就意味着,你的变量、函数参数、返回值等等都是肯定类型的,当你试图使用不兼容的类型,那么你的开发工具会提示你错误,而且拒绝给你编译。typescript
开发工具智能提示express
主流的开发工具都支持TypeScript,智能提示会让你感受像是在使用Idea来写Java代码同样的享受。编程
方便的代码重构segmentfault
面向对象与接口编程,拥有很是清晰的代码结构,可读性大大提升。数组
容易上手,初次接触,也能看懂浏览器
高度兼容原生脚本语法,对语法的破坏性较少,即便没接触过的人,也能很快上手,初次阅读也没有什么障碍。less
本着解决JavaScript的糟糕之处,这注定是个不平凡的开源项目。
Phaser、Cocos2dx、laybox、白鹭等等游戏引擎都有TS版本。更多的使用TypeScript的开源项目能够参考这里。函数
关于开发环境搭建与调试配置能够参考这里。
下面正式介绍TypeScript的基础类型,不管学习一门什么语言,从基础类型开始都再合适不过了。
//let const //let 定义的变量有一个新的变量环境 for (let i = 0; i < 10 ; i++) { setTimeout(function() {console.log(i); }, 100 * i); } //const 定义的变量属于常量,不能更改 const a: number = 19; //a = 20;//错误,不容许改变常量 const alian = { name: "alian", age: 35 } // 错误,由于alian是const定义的 // alian = { // name: "haha", // age:22 // }
let定义的变量不会像var定义的变量那样污染全局环境。
const定义一个对象的时候,能够修改对象的属性值,可是不能修改对象引用。
// 布尔类型 let success: boolean = true; let failed: boolean = false;
类型名boolean定义一个布尔类型,值为true或false。若是不写类型名,则会自动推断出类型。
// 数字类型 let dec: number = 9;//10进制 let hex: number = 0xABCD;//16进制 let bin: number = 0b1011;//二进制 let octal: number = 0o123;//八进制
关键字number定义一个数字类型,值能够是二进制(0b开头)、八进制(0o开头)、十进制、十六进制(0x开头)。
// 字符串 let hello: string = "hello"; let world: string = 'world'; let today: number = 1.26; let express: string = `${hello} ${world}, today is ${today}`;//模版字符串
关键字string定义一个字符串变量。
使用``定义一个多行字符串(能够带有表达式 ${变量名})。
// 数组 let numbers: number[] = [0x1, 0o32, 0b11, 3, 2, 1]; let names: string[] = ['ana', 'hello', `${hello} + ${world}`]; let result: Array<boolean> = [true, false, !1];//数组泛型,Array<元素类型>
类型名称[] 定义一个指定类型的数组。
Array <类型名称> 一样定义一个指定类型的数组。
//元组 Tuple let x: [string, number, boolean]; x = ['name', 35, false]; console.log(x[0].substr(1)); //ame console.log(x[1].toString()); //35
[类型名、类型名...] 定义一个元组,一个元组里能够包含几个不一样类型的变量。
//枚举 enum Color {Red = 1, Green, Blue} let color: Color = Color.Blue; let color2: string = Color[2]; console.log(color2); //Green
很是有用的一种类型。关键字enum name{value...} 定义一个枚举。默认状况下,从0开始为元素编号,能够手动设置一个数字编号,后面没有设置编号的会依次往上叠加。
TypeScript 2.4开始支持枚举成员变量包含字符串构造器,如enum Color {Red = 'a', Green = 'b', Blue = 'ccc'},只是每一个元素的编号都要手动设置,须要注意的是字符串枚举成员不能被反向映射到枚举成员的名字。 换句话说,你不能使用 Color["a"] 来获得 "Red" 。。
有了枚举就能够把同类型可是互斥的变量定义成一个枚举,而不用定义成一些变量了(好比描述一个音量开关按钮的开关状态等等)。
//Any let y: any = 4; y = false; y = 'type not sure'; //y.name(); console.log((y as string).length); //13 let anyArray: Array<any> = [false, 'true', 23];
虽然是强类型的,可是有了any就有了自由。一个定义为any类型的变量,在使用的过程当中能够改变它的值类型,甚至能够调用它的方法,可是须要当心,若是没有这个方法,会出异常。
//Void function noReturn(): void { console.log('no return function'); } let useless: void = null; useless = undefined;
某种程度上来讲,void类型像是与any类型相反,它表示没有任何类型。好比定义一个方法没有返回值。
声明一个void类型的变量没有什么大用,由于你只能为它赋予undefined和null。
//Null 和 Undefined let u: undefined = undefined; let n: null = null; let age: number = undefined; let married: boolean = null;
和 void类似,它们的自己的类型用处不是很大。
默认状况下null和undefined是全部类型的子类型。 就是说你能够把 null和undefined赋值给其它类型(好比number、string等等)的变量。
//Never function fail(message: string): never { throw new Error(message); }
一样是一个没什么用的类型。never类型表示的是那些永不存在的值的类型。 例如, never类型是那些老是会抛出异常或根本就不会有返回值的函数表达式或Lambda表达式的返回值类型。
let y: any = 4; y = false; y = 'type not sure'; //y.name(); console.log((y as string).length); //13 console.log(<string>y.length); //13
当我肯定某个变量是什么类型的时候可使用类型断言,明确告诉编译器我知道它是什么类型。类型断言使用y as string或者
y 两种方式都行。
九层之台,起于垒土,千里之行,始于足下。有了类型基础,就能够对TypeScript进行下一步的观光学习了。