因爲本人主要是分享使用h5遊戲引擎進行開發方面的小知識,所以此教程主要是針對一直使用javascript開發想嘗試使用typescript作爲遊戲開發語言的同學,所以這裏只講解開發中最常用的ts基礎語法,保證看完本章之後能夠看懂並開發cocos creator/laya air遊戲引擎的Typescript代碼,要求讀者有javascript基礎並瞭解ES6特性。除了本章內容外ts還有很多其他的但不常用的特性這裏不會介紹,想詳細學習請參考官方手冊:https://www.tslang.cn/docs/handbook/basic-types.html
本章內容分幾個部分介紹:
- 瞭解什麼是強類型、弱類型、靜態類型、動態類型:
- TypeScritp介紹
- 基本數據類型
- 函數的使用
- 類的使用
- 模塊的導入導出
- as的使用
- 泛型
注意:文中ts代碼直接使用laya air遊戲引擎作爲運行環境,如果想使用原生環境請百度安裝node.js配置環境。
一、強類型、弱類型、靜態類型、動態類型:
1.強類型語言:
強類型語言簡單來說就是一種強制類型定義的語言,如果某一個變量被定義類型,如果不經過強制或隱式轉換,則它永遠就是該數據類型了,強類型語言包括Java、c#、C++等高級語言。
2.弱類型語言:
弱類型語言是變量值的類型是可自動改變的,如果某一個變量被定義類型,該變量可以根據環境變化(賦值)自動進行轉換,不需要經過顯性強制轉換。弱類型語言包括vb 、PHP、javascript等語言。
所以強類型語言還是弱類型語言的判斷標準是是否會隱性的進行語言類型轉變。
3.靜態類型語言:
靜態語言是變量的數據類型的檢查是發生在編譯階段(運行之前)。
4.動態類型語言:
動態語言是變量的數據類型的檢查是發生在代碼運行階段。
二、Typescript介紹:
而Typescript就是一種靜態弱類型的解釋型語言(按照定義ts應該是一直強類型,但因爲ts最終會被編譯成js代碼所以被普遍認爲是一種弱類型), Typescript作爲Javascript的超集,在Javascript的基礎上添加了靜態類型的檢查、類型定義、類(ES6雖然也有)、缺省參數值等等特性,並且完全支持ES6標準,且兼容Javascript的所有版本,JavaScript程序可以直接移植到TypeScript,在運行階段Typescript其實會全部轉成Javascript代碼(語法轉換),解釋器本質上還是運行的js代碼。
Typescritp的出現意味着將用於可以開發大型項目,並且幫助開發人員能夠在編譯階段就發現問題(靜態檢查)。
關於ts使用這裏推薦一個知乎鏈接:https://www.zhihu.com/question/64563945
三、基本數據類型:
下面直接進入ts語法教程:
(1)在ts中一共提供了十三種基本數據類型(Never、元組和枚舉等很少用到在此不做介紹),在ts聲明變量的基本格式是:
類型聲明 變量:數據類型 = 值;與js一致通過var或let(ES6)類聲明一個變量:
1.布爾類型:
let bool_num: boolean = false;
2.Number:
let decLiteral: number = 6;
3.String:
let name: string = "bob";
4.數組:
let list: number[] = [1, 2, 3];
布爾、string、數組這些基本學過一點點編程的都會知道這裏不贅述,ts中的number就相當於是將高級語言中的int、long、float等等與數值有關的全部打包而成一個類型。
5.Any:
let notSure: any = 4;
any類型其實就是js中的var類型,該類型會根據所賦的值自動轉成相應類型
6.Void:
let unusable: void = undefined;
7.空類型,表示沒有任何類型,只能爲它賦予undefined和null,主要用於函數(與c語言類似)
- Object: 除上述所有類型之外都是object類型,通常情況下是指函數、類的對象、表;
- Null和Undefined: 與void類似,打印沒有賦值的變量就是null或者undefined
四、函數的使用:
函數聲明:
函數聲明格式: function 函數名():函數返回值類型 { }(跟js一樣function可以省略)
如果是void類型可以沒有返回值,如果是其他類型必須通過return 對應類型的返回值(ts的打印跟js的打印是一樣的);
五、類的使用:
與java、c++等高級語言一樣,typescritpe通過也是通過class關鍵字來聲明類,類中有成員屬性和成員方法,並且擁有public、private、protected這三級權限,在類中默認情況下就是public類型(照顧小白,有面嚮對象語言基礎的大佬可以直接跳過):
1.聲明類:
聲明類的格式:Class 類名{類的屬性或方法}
通過class關鍵字創建一個類後,再通過new關鍵字創建一個類的對象,通過該對象就可以調用類的屬性或方法
2.三級權限:
Public(公有):類的對象以及類的子類都可以使用類的該屬性和該方法;
Protected(保護):只有繼承了該類的子類(後續講)才能調用類的中的該屬性和該方法;
Private(私有):除了類本身外,任何對象(包括子類)都不可調用改類的該屬性和該方法;
3. 類的屬性和方法的使用:
所謂類的屬性其實就是聲明在類中的變量,所謂類的方法其實就是聲明在類中的函數:
4.類的繼承:”繼承”是指該子類將擁有所有父類protected和public類型的方法。子類(衍生類)通過extends關鍵字繼承父類(基類),再在子類的構造方法中寫入關鍵字super()才能真正繼承到父類:
5.類的(屬性)方法重寫:
在編寫的過程中可能會遇到這麼一種情況:子類的方法與父類方法出現重名。當發生這種情況時,因爲編譯器會首先在子類中進行查找,調用子類的方法,如果沒有則通過隱藏的_proto_去父類中進行查找,如果有再調用該父類的方法(不知道_proto_的同學可以看看我前面的文章,或者去百度下”js 原型鏈”):
6.抽象類:
抽象類是一種通過abstract關鍵字修飾的類,在抽象類中可以通過abstract創建抽象方法留給子類去實現,抽象類只能用於給子類繼承使用,且不能通過new創建對象。
這種類存在的意義就是爲了提高開發效率,統一接口的使用。
7.Readonly(只讀)和static(靜態)關鍵字:
被readonly聲明過的變量將變爲只讀變量,在初始化後不可再修改變量值:
被static聲明過的變量將變爲靜態變量,在類外面(裏面同理)可以直接通過”類名.變量名”的方式訪問:
六、模塊導入導出:
ts中的模塊導入其實跟ES6是一樣的,通過export 導入,import from導出(關於ES6中import 和export 使用格式其實非常多,這裏不贅述):
A模塊代碼:
B模塊代碼:
七、as的使用:
as的作用是做類型的強制轉換,基本數據類型和類都可以使用,注意類如果要轉換隻能從子類向父類轉:
八、泛型:
泛型的作用簡單來說就是統一了類中屬性和方法的類型,泛型的存在大大的提高的代碼的重用性,先直接上代碼:
如圖在類的後面添加<T>, 這個”<>”中的值可以任意,他指定了類中使用”T”進行聲明的變量或函數的類型,比如上面我在<>中傳入了number類型,那麼他的成員屬性num和成員方法func都成number類型(注意方法要有返回值);
有了上面這些基礎知識,做遊戲開發基本沒有什麼問題,當然ts還有命名空間、交叉類型等等其他特性這裏沒有介紹,但laya開發過程中基本不會用到,這裏不做介紹,想深入學習ts請查看上面給出的官方文檔鏈接。