相信你在寫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進行下一步的觀光學習了。