-
TypeScript具有類型系統,且是JavaScript的超集。它可以編譯成普通的JavaScript代碼。 TypeScript支持任意瀏覽器,任意環境,任意系統並且是開源的。Ts主要用於解決那些問題:
-
js木有編譯類型檢查,寫代碼的時候木有錯誤,在運行的時候就發現錯誤一大堆,ts具有類型系統,可以解決此類問題
-
js代碼非常靈活,同一團隊中,大神和小菜鳥寫的代碼各不相同,維護起來十分不便,統一采用ts開發js,使用相同的規則進行編碼,能夠比較好的解決此類問題
-
js發展十分迅速,存在各種各樣的版本和各種環境,在不同的環境中特性存在差異,為了滿足各種環境,需要編寫各異的代碼,js通過制定編譯環境可以將同一代碼編譯成對應環境的js腳本
-
js在編譯大型項目缺乏良好的模塊及文件的組織,需要支持有模塊及命名空間的概念,遵循CommonJs的規范,ts支持模塊及命名空間,同時支持。
-
環境
-
安裝
node install –g typescript
-
VSC
-
tsconfig.json:指定ts編譯的一些參數信息
"compilerOptions":
-
Target:編譯目標平台(es3,es5,e6,es2015)
-
Module:組織代碼方式(commonjs,amd)
-
sourceMap:編譯文件對應關系
-
outDir:輸出目錄
"exclude":不包含的編譯目錄
-
tasks.json:指定編譯的命令
快捷鍵 ctrl+shift+p 調出命令窗口,選擇 Configure Task Runner 創建如圖所示
參數 "args" 指代編譯的范圍
-
聲明
-
var
最常用的關鍵字,用來聲明對象,例如
var關鍵存在一些弊端,例如:
-
變量可以重復聲明
-
變量聲明可以滯后
-
沒有塊級作用域
-
let
為了解決 var 關鍵字的以上弊端,提出了 let關鍵字,基本用法和var關鍵字一樣,如下:
-
const
定義的變量不可以修改
-
類型
-
布爾
簡單的true/false值
-
數字
浮點型的數字
-
字符串
-
數組
在類型后面直接使用[]
使用Array泛型
-
枚舉
enum 類型是對js類型的一個補充,使用枚舉類型可以為一組數值選擇一個友好的名稱
-
函數
-
完整函數類型
完整函數類型包含兩部分:參數類型和返回值類型
上訴寫法過於復雜,ts提供類型推斷,可以簡化寫法,如下所示
-
參數類型
-
默認參數
默認參數可以指定參數默認值,函數調用時可以不用傳遞默認參數
-
可選參數
可選參數在參數后用 ? 來表示,可選參數只能在必須參數后
-
剩余參數
剩余參數表示不知道傳遞多個類型相同的參數可以使用,剩余參數只能用類型數組來表示,並在參數前加上省略號,剩余參數只能是最后一個參數
-
Lambda和this
看如下所示的代碼,調用out函數的this 對象被指定為全局變量導致調用失敗
在ts中,函數表達式變為使用lambda表達式( () => {} ),這樣就會在函數創建的時候就指定'this'值
編譯后的結果如下所示
-
類
-
結構
ts中類的基本結構如圖所示,在ts里,每個成員默認為public的,也存在 private 及 protected,private只能在自身類可用,protected可在繼承類中使用
-
抽象類
抽象類使用abstract關鍵字來定義抽象類和在抽象類內部定義抽象方法,抽象類只能用派生類實例化,抽象方法必須在派生類中實現
-
繼承
面向對象最基本的模式就是對類型進行繼承擴展,如圖所示,Dog繼承了抽象類animal,實現了抽象方法say,並重寫了父類中的move方法
-
靜態成員
類的靜態成員,這些屬性存在於類本身上面而不是類的實例上
-
接口
-
結構
與C#或Java里接口的基本作用一樣,ts也能夠用它來明確的強制一個類去符合某種契約。如下所示,Squre類實現Shape接口。
-
繼承
接口可以繼承多個接口,使用extends關鍵字來繼承多個接口,如下所示
-
泛型
ts像C#和Java,可以使用泛型來創建可重用的組件,一個組件可以支持多種類型的數據,ts中使用(<>)括起泛型類型
-
模塊
為了開發大型的代碼程序,模塊化是必須經歷的一個過程。ts組織代碼的方式主要包括內部使用的命名空間和外部使用的模塊。
-
命名空間
當代碼變得復雜的時候,要一種手段來組織代碼,以便於在記錄它們類型的同時還不用擔心與其它對象產生命名沖突,這時候我們使用命名空間。命名空間內的代碼只在命名空間內才是可見的,對外部不可見。
-
外部模塊
模塊在其自身的作用域里執行,在一個模塊里的變量,函數,類等等在模塊外部是不可見的,除非你明確地使用export形式之一導出它們。相反,如果想使用其它模塊導出的變量,函數,類,接口等的時候,你必須要導入它們,可以使用import形式之一。
模塊是自聲明的;兩個模塊之間的關系是通過在文件級別上使用imports和exports建立的。
任何聲明(比如變量,函數,類,類型別名或接口)都能夠通過添加export關鍵字來導出,
可以使用以下import形式之一來導入其它模塊中的導出內容。
-
導入一個模塊中的某個導出內容
-
將整個模塊導入到一個變量,並通過它來訪問模塊的導出部分
CommonJS和AMD都有一個exports對象的概念,它包含了一個模塊的所有導出內容。ts模塊支持export =語法,以配合傳統的CommonJS和AMD的工作流。
export =語法定義一個模塊的導出對象。它可以是類,接口,命名空間,函數或枚舉。
若要導入一個使用了export =的模塊時,必須使用TypeScript提供的特定語法import let = require("module")。
-
示例
-
編碼規范
-
使用PascalCase為類型命名。
-
不要使用I做為接口名前綴。
-
使用PascalCase為枚舉值命名。
-
使用camelCase為函數命名。
-
使用camelCase為屬性或本地變量命名。
-
不要為私有屬性名添加_前綴。
-
1個文件對應一個邏輯組件(比如:解析器,檢查器)。
-
不要導出類型/函數,除非你要在不同的組件中共享它。
-
不要在全局命名空間內定義類型/值。
-
共享的類型應該在types.ts里定義。
-
在一個文件里,類型定義應該出現在頂部。
-
使用 undefined,不要使用 null。
-
由於種種原因,我們避免使用一些方法,而使用我們自己定義的。
-
不使用ECMAScript 5函數;而是使用core.ts這里的。
-
不要使用for..in語句;而是使用ts.forEach,ts.forEachKey和ts.forEachValue。注意它們之間的區別。
-
如果可能的話,嘗試使用ts.forEach,ts.map和ts.filter代替循環。