使用Typescript開發 (一)

jasonho123發表於2018-12-22

ES5和ES6中提供了類、模組以及裝飾器等等這些特性,其中有些特性已經在Typescript中實現了。而Typescript支援額外的型別註解,所以與Javascript相比,他支援更多語法特性。

Typescript 用法

看十遍書籍不如手動敲一遍,所以為了能讓這些程式碼執行起來,需要在你的機器裝上TS編譯器。

用npm安裝Typescript

  1. 全域性安裝Typescript編譯器和可執行程式(tsc):
    $ npm i -g typescript
  2. 驗證是否安裝成功:$ tsc -v

簡單執行TS程式

  1. 新建一個example.ts並在編輯器裡輸入:
let a = `123`;
console.log(a);
複製程式碼
  1. 使用tsc命令編譯檔案:$ tsc example.ts

會發現,在hello.ts同一個目錄下面,看到一個example.js檔案。

使用Typescript開發 (一)

那其實生成的js檔案等同於Typescript編譯器輸出的內容,可以用$ node example.js驗證:

使用Typescript開發 (一)

使用靜態型別

使用靜態型別,首先能幫助我們避免出錯並且提高效率。在寫JS時候,編輯器(例VScode)都是在執行時語法高亮,對程式碼提供一些自動化完成建議。
而Typescript發揮自身靜態型別檢查的優勢,把所有型別宣告剔除,生成合法的Javascript程式碼。

顯式型別

舉個例子:

let word: string = `apple`;
console.log(word);
複製程式碼

最後輸出:

使用Typescript開發 (一)

這段程式碼的意思很顯然:使用const語法定義了一個變數word,而且還宣告word的型別式string,值為apple。

修改word的值

let word: string = `apple`;
word = 123;
console.log(word);
複製程式碼
使用Typescript開發 (一)

平時在JS程式碼中這裡正確的,發現word被設定為指定型別之後,就不能再賦值為其他型別。那如果我想允許修改任何型別的值,如何?

any型別

可以使用關鍵字any把變數宣告為any型別,那麼基本上就是便攜動態型別了,導致無論是編譯時還是執行時都不會丟擲任何錯誤,所以這樣就失去了TS帶來的優點。

let word: any;
word = {first:`1`}
word = `apple`;
word += 100;
console.log(word); // apple100
複製程式碼
使用Typescript開發 (一)

型別推斷機制

靜態型別由於要新增各種必須的型別註解,會使得程式碼變得很囉嗦。可以使用型別推斷機制編寫簡潔的程式碼,不需要顯示定義。所以,Typescript的編譯器可以智慧猜測程式碼中表示式的型別,比如:

let word = `apple`;
word = 123;
console.log(word);
複製程式碼
使用Typescript開發 (一)

編輯器發現定了變數word,值為string型別的apple,就無法變成number型別的123了。

另一種情況,如果宣告變數時候不賦值,那麼編譯器會自動設為any型別:

let word;
word = `apple`;
word = 123;
console.log(word); // 123
複製程式碼

多個表示式推斷

上面例子都是一個表示式的型別推斷,那麼在多個型別推斷會發什麼結果?
比如:

let arr = [`apple`, 100]
arr.push(`pear`)
console.log(arr) // [ `apple`, 100, `pear` ]
複製程式碼

這種情況,arr的型別將會變成any型別的陣列。

但是,又比如:

let arr = [`apple`, `pear`]
arr.push(122)
console.log(arr) 
複製程式碼

發現:

使用Typescript開發 (一)

這種情況,arr的型別將是number[]。

與上下文有關

如果表示式的型別是由它所在的位置隱式決定,那麼發生型別和上下文有關的情況。

document.body.addEventListener(`click`, e => {
  e.sayHello();
});
複製程式碼

回撥函式中引數e的型別是編譯器猜測而來,依據是引數e所在的上下文,會根據呼叫addEventListener的位置以及傳遞給方法的引數情況去了解e的型別。

總結:這篇內容比較簡單,偏向基礎性的內容。下一篇主要介紹Typescript的型別:原生型別,Object型別以及泛型和外部型別定義。

PS:寫Typescript筆記的理由不是為了騙點選量和關注量,只是想一邊學習之餘一邊整理自己的認知,做一次系統回顧。

相關文章