天天看點

TypeScript快餐教程 (1) - 初識TypeScript快餐教程 (1) - 初識

JavaScript,更廣泛點也許可以說是ECMA Script的各種實作,從誕生到現在,一直就沒斷過争議。ECMA Script 4的夭折正是這些争論嚴重程度的重要展現。

Anyway,不斷争議如何,JavaScript的地位一直不曾被撼動。針對JavaScript存在的問題,可編譯成JavaScript的語言一直就前仆後繼。

這其中,DART,CoffeeScript和TypeScript是其中最有名的三個。

DART由Google推出,設計者是大名鼎鼎的v8引擎作者Lars Bak.

DART很像是一種傳統的面向對象式的語言,比如很像Java。

我們來看個小例子:

怎麼樣?這個文法比ECMA Script 6還需要用constructor()函數用起來更像Java吧?

DART的優勢:

在Google中被廣泛使用

在Fuchsia作業系統中被用來寫應用代碼

文法特别适合Java/C#使用者學習

CoffeeScript是一門以發揚JavaScript的good part的小型語言。作者有比較好的Ruby功底,是以CoffeeScript寫出來有較濃的動态語言的風格。

例:

翻譯成JavaScript代碼,是這樣的:

為了避免使用在JavaScript中比較trick的<code>==</code>操作符,CoffeeScript提供了<code>is</code>操作符來簡化使用<code>===</code>帶來的不快。

另外,為了友善程式員的使用,CoffeeScript提供了yes和on作為true的别名。

這樣的小優化,在CoffeeScript中随處可見。

CoffeeScript的最要優勢之一是Github的編輯器Atom代碼中使用了大量的CoffeeScript。并且Atom的plugin可以使用CoffeeScript開發。

CoffeeScript的方向是更加自由,更像腳本語言一些,跟DART的像傳統語言的方向基本上是背道而馳。

下面,當當當當,我們的主角TypeScript就要出場了。

TypeScript比起Google的Dart絲毫不遜色,因為它也是出自名門,是微軟公司的産品。他的主要負責人可是比Lars Bak成名早得多的大牛Anders Hejlsberg。Anders曾經上司開發了偉大的産品Turbo Pascal,Delphi和.Net及C#.

TypeScript通過tsc工具,将TypeScript轉化為javascript,再執行javascript.

TypeScriptv既然叫Type Script,有類型的腳本語言。我們這一講就從類型說起。

Type Script中第一個不同于其他同類語言的一點是,它支援一個變量可能是多種類型。

比如我們有一個指令行參數,可能是一個字元串,也可能是一個字元串數組。這很好啊,我們就聲明是兩種類型就好了:

既然支援聯合類型了,那麼給靜态檢查就帶來困難了啊。這可如何是好呢?TypeScript提供了類型守護功能,當Type Script能确認在一段代碼中,确定是一個類型之後,就會對它按照這個類型來進行檢查。

比如我們按paras是string的情況來判斷,那麼在這個if塊中,paras就是string.例:

請允許我迫不及待地先介紹非侵入式的類型系統。

非侵入式,也就是說,一個類,實作某個接口,隻要實作了該接口要求的所有方法就可以了,并不需要像Java一樣明确地用implements來進行說明。Go語言中就是這樣做的,TypeScript也是如此,我們看個例子:

Point接口定義了x,y兩個變量。ColorPoint類隻要同樣定義x,y兩個同類型變量,就算是實作了Point接口。在定義變量類型時,就可以用Point做他的類型了。

這樣是不是比DART那樣用extends來寫更有趣一些呢?

不過,這隻是TypeScript的文法糖,我們來看下tsc生成的js代碼,Point直接被無視掉了:

TypeScript支援枚舉類型。從生成的代碼來看,功能還是挺爽的。

例:TypeScript源碼:

生成的JavaScript代碼:

數值類型與JavaScript一樣,隻支援number類型。

數組可以用數組方式寫,也可以用泛型的方式寫:

TypeScript的布爾類型,理論上隻支援true和false。

但是實測下來,賦null和undefined也是可以的。

TypeScript因為最終要生成JavaScript代碼,是以很多都是一些編譯期的檢查。當生成JavaScript代碼時,這些資訊就丢失了。

比如上面布爾型的例子,生成的JavaScript代碼,會把類型資訊全部丢掉:

數值的例子也是一樣:

是以,總結起來,對于基本類型,TypeScript主要是進行編譯期檢查,包括聯合類型和類型守護皆是如此。一旦編譯通過生成JavaScript,這些類型資訊就将全部丢失。