- 原文地址:TypeScript — JavaScript with superpowers
- 原文作者:Indrek Lasn
- 譯文出自:掘金翻譯計劃
- 本文永久連結:github.com/xitu/gold-m…
- 譯者:jonjia
- 校對者:moods445 goldEli
TypeScript:擁有超能力的 JavaScript (上)
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/8fd875a66bc893ca180825d58c6ad65e4d41470a9fa1b1459768b6af846288f2.png)
JavasSript 很酷。但你知道什麼更酷一點嗎?TypeScript。
你能看出這段程式碼有什麼問題嗎?
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/5b95fcfe75a97143bdd7330b411c9ebd12e71f948fcef95769f966be7d5815bd.png)
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/a80d8098ba081ec82619ec984af9244a723774fb523619266b363d97f68e14f9.png)
TypeScript (上) 對比 ES6 (下)
TypeScript 可以看出來。看到那個紅色的下劃線了嗎?這就是 TypeScript 給我們的錯誤提示。
你可能已經發現了這個問題(乾的漂亮) — toUpperCase()
是 String 的方法,我們將一個整型作為引數傳遞過去,顯然不能在整型上呼叫 toUpperCase()
方法。
我們通過宣告 nameToUpperCase()
方法的引數只能為 string
型別來修復這個問題。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/cc5221b4c904bf10e556fc8d42b8afc7b47e2ea88dad37c0b16b8ed96b7987ed.png)
棒棒噠!現在我們不用自己去記 nameToUpperCase()
的引數型別必須為 string
,我們可以信任 TypeScript 去記住它。想象下,如果有成千上萬個引數型別需要我們記住。太瘋狂了吧!
還是有錯誤警告。為什麼?因為我們還是傳遞了個整型引數!傳遞個 string
型別的引數就好了。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/3e9c05d347021834bbc3b53513bd59a987499cafd26a47cc9619a65137399b6f.png)
注意 TypeScript 最終還是會被編譯成 JavaScript (它只是 JavaScript 的一個超集,就像 C++ 和 C 的關係一樣)。
以上就是 TypeScript 和型別檢查強大的原因。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/3b265258c28c1d1c55af8d5c317728ba8e899cffce5fb98d71c5caf1811f1529.png)
TypeScript 上個月(譯註:2018年1月)有 10,327,953 的下載量。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/eb0dfdec0055b278b91700f9d3e4e0463cc40ed84565eae2f18f691c6f28b9a0.png)
TypeScript vs Flow 下載量對比
讓我們開始探索 TypeScript 的世界 — 在深入探究之前,先來了解下 TypeScript 究竟是什麼以及為什麼存在。
TypeScript 於 2012 年 10 月 1 日正式開源。 由 Microsoft 開發維護,C# 的首席架構師 Anders Hejlsberg 帶領他的團隊參與了 TypeScript 的開發。
TypeScript 在 GitHub 上完全開源,所以任何人都可以閱讀它的 原始碼 並做出貢獻。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/216c22511b2cb1f02720bd6b9eff38f7e2a9de01323d0188e072ba8a6f35b61b.png)
TypeScript — JavaScript 的超集。
如何開始
實際上非常簡單 — 我們只需要安裝一個 NPM 包。開啟你的終端,輸入以下命令:
npm i -g typescript && mkdir typescript && cd typescript && tsc --init
複製程式碼
再設定下 TypeScript 的配置檔案就可以了。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/5304ea2485a96f208eee4c90ba85dbf70e708c391f3f7b2d498fe914aacef17f.png)
我們只需要建立一個 .ts
檔案,並告訴 TypeScript 編譯器監視檔案變化。
touch typescript.ts && tsc -w
複製程式碼
tsc — TypeScript 編譯器。
最後一步
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/6a1e31c18dca25878964b7d99fd7ce7e09fe494bfff208dc5a5d2b4c306d50d3.png)
太好了 — 現在你可以跟著我們的示例一起練習。
我們在 .ts
檔案中編寫程式碼,編譯後生成的 .js
檔案是在瀏覽器中執行的程式碼。在這個例子中,我們不是用瀏覽器環境,我們使用 NodeJS 環境(所以 .js
是在 Node 環境中執行的)。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/027455c86acdee7ce89f6b3d0c225cf67b690897e55c5db4fb2ee7728d21d3df.png)
JavaScript 有 7 種資料型別,其中 6 種是基礎型別,剩下的被定義為 Object 型別。
JavaScript 基礎型別如下:
- String
- Number
- Undefined
- Null
- Symbol
- Boolean
剩下的都是 objects
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/3b5e12c78c64534d6c2ceb9c406275ee8ef021d8616b84c145a5b618a2204da4.png)
TypeScript 支援與 JavaScript 相同的基礎型別,此外還提供了一些額外的型別。
額外的型別是可選的,如果你不熟悉那些型別,你就可以不用。我發現使用 TypeScript 的好處就是:使用起來靈活方便。
額外的型別如下:
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/523502b2bc96f44506692e290f2abdeb9ec328263891e492500f50edf5f42359.png)
元組(tuple)就是組織好結構的陣列,只是按照順序定義好陣列元素的型別
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/6d3a9ff7ff73540622cfb91a65fa40d93635854b3cab4aa4dbee9a26d9a57ae1.png)
普通陣列 vs 元組(組織好結構的陣列)
如果你不遵守元組定義好的規則,TypeScript 會給我們發出錯誤警告。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/4562f8cea793458c378650d199d43169d546dda6a7603180a87f7f2941928cc4.png)
元組定義了第一個元素是 number
型別,但賦值時並不是 number
型別,而是一個值為 "Indrek"
的 string
型別,所以編譯結果會報錯。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/399273212f9135b39669b77c90bf93cfd402f82cfdad916242d143ad939e12bd.png)
在 TypeScript 中,你需要定義函式返回值的型別。因為有很多沒有 return
語句的函式。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/942b99784de7d9db35aff2d582c4f62d7dd9e9150c85a7db5360e2c009e5a2f3.png)
看一下我們是怎麼宣告引數和返回值型別的 — 它們的型別都是 string
。
如果我們沒有返回任何值會怎麼樣?下面例子的函式體中只有一條 console.log
語句。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/8e2f1c3b56b8a324fc0826bee2c53bb258eb0fe84e68508ac29d084bcb8c5b6c.png)
我們可以看到,編譯結果提示我們:“嘿,你明確表示我們必須返回一個 string
型別,但你實際上沒返回任何值。我就是告訴你,你沒有遵守我們的規則。”
如果我們就是不想返回任何值該怎麼辦呢?比如我們的函式中有一個回撥函式。在這種情況下就可以宣告返回值的型別為Void
。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/9c2e1aa80ecd328d642f7e02034e89cb21d98c3aa6ebe3866c089bc78d0e28c0.png)
但有時候我們的函式確實有返回值,不管是隱式還是顯式地,我們都不能將返回值的型別設定為 Void
。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/a76d1e9e054602765d851fe8a3aad321619bbdc6fc0fbf1e63ed2f8fd722a266.png)
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/602abe55dd7029593c2dab206b849aa17b3f1d0881e1f3df2fe62fc659951ad1.png)
any
型別非常簡單,如果我們要為還不清楚型別的變數指定一個型別的話,就可以指定為 any
比如下面的例子:
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/d7635bb35674f0536612f7807650df07d1189652c636b8cef8fb01cfdbfafe7b.png)
可以看到我給 person
變數多次賦值,每次使用的值的型別都不同。第一次是 string
型別,然後是 number
,最後是 boolean
。我們無法確定這個變數的型別。
如果你使用第三方的庫,你可能會不知道某些變數的型別。
讓我們宣告一個陣列,你把從某個 API 獲取到的資料儲存到這個陣列中。陣列中的資料是隨機的。它不會只包括 string
、number
,也不像元組那樣有組織好的結構。any
型別就可以解決這個問題。
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/209ca03673dfb0dd2875a668a64bde08060ee5ee368674d245e488d57fbadebb.png)
如果你知道陣列的元素都是同一種型別,你可以使用下面的語法宣告:
![[譯] TypeScript:擁有超能力的 JavaScript (上)](https://i.iter01.com/images/3ba9514e3ebeee1945dfb83f00ab4ab48f7f98d75485e0702d85b7d9f75b8f10.png)
這篇文章的篇幅已經夠長了,我們將在下一篇文章繼續。我們還剩下 — enum
— never
— null
— undefined
這些基礎型別和型別斷言需要討論。
如果你想深入學習,可以閱讀 TypeScript 的 官方文件
由於好多人問我這篇文章中的圖片使用的什麼編輯器。我使用 Visual Studio Code 編輯器,配合 Ayu Mirage 主題和 Source Code Pro 字型。
你可以在我的 Medium 上發現更多有趣的文章。
也可以關注我的 twitter。❤
感謝閱讀!
掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。