本書適合各類程序員閱讀,例如JavaScript 專業工程師、C# 從業者、Java 擁護者、Python 愛好者、Ruby 偏愛者和Haskell 支持者。不管你使用什麼編程語言,隻要有一定的編程經驗,了解函數、變量、類和錯誤等基礎知識,就可以閱讀這本書。如果你使用過JavaScript,有文檔對像模型(DocumentObject Model,DOM)和網絡編程經驗,那就更好了。本書雖然沒有深入探討這些概念,但是將從這些方面舉例。如果你不熟悉這些概念,可能無法深入領會示例的意圖。
無論使用哪一門編程語言,我們都有共同的經歷。為了追查異常,我們一行一行分析代碼,找出問題所在,各個擊破。而TypeScript 能助我們一臂之力,它會自動檢查代碼,指出那些逃過我們眼睛的錯誤。
如果你沒使用過靜態類型語言也沒關繫。筆者將教你類型的知識,告訴你如何使用類型減少程序崩潰的可能、提升代碼的語義,便於多位工程師共同維護,也讓應用能惠及更多的用戶,能在多臺服務器上彈性伸縮。在行文上,筆者將力求淺顯易懂,以直觀、易記的方式講解相關概念,從實用角度出發,通過大量示例把抽像的問題講清楚。
與其他類型語言相比,TypeScript 的特點是非常注重實用。TypeScript 發明了一套全新的概念,保證代碼簡潔、準確,使編寫應用的過程充滿樂趣,更符合現代標準,也更安全。
內容結構
本書有兩個目的:一是深入講解TypeScript 語言的原理(理論層面);二是給出大量實用的建議,助你寫出更好的TypeScript 代碼(應用層面)。
前面說過,TypeScript 是一門注重實用的語言,理論與應用往往是聯繫在一起的。本書多數篇幅將穿插講解這兩方面,不過前幾章基本隻講理論,後幾章則幾乎隻說具體應用。
本書首先介紹編譯器、類型檢查器和類型的基礎知識。然後,分別說明TypeScript 中不同類型和類型運算符的作用和用法。掌握這些基礎之後,可以深入探討一些高級話題,比如TypeScript 最為復雜的類型繫統特性、錯誤處理和異步編程。最後,說明怎樣結合你最喜歡的框架(前端和後端)使用TypeScript,如何把現有的JavaScript 項目遷移到TypeScript,以及如何在生產環境下運行TypeScript 應用。
本書每章的末尾都有練習題,請你嘗試自己解答,這樣纔能更深入地領會所講的內容。練習題的參考答案在網上,地址為https://github.com/bcherny/programming-typescript-answers。
代碼風格
本書盡量一以貫之,使用同一種代碼風格。筆者采用的代碼風格有一部分帶有強烈的個人風格,例如:
? 隻在必要時使用分號。
? 使用兩個空格縮進。
? 在簡單的代碼片段中,或者程序的結構比細節重要時,使用簡短的名稱命名變量,例如a、f 或_。
本書使用的編程風格,有一部分也建議你采用。比如說:
? 應該使用最新的JavaScript 句法和特性(最新版JavaScript 通常稱為“esnext”)。這樣能讓代碼符合最新的標準,提升代碼的互操作性,便於搜索,也能減少新員工的前期投入時間。此外,還可以充分利用JavaScript 的新特性,例如箭頭函數、promise 和生成器。
? 盡量使用展開運算符(...),保持數據結構不可變。注1
? 所有值都要有類型,不過盡量推導而出。切記不要濫用顯式類型,讓類型錯誤暴露出來,從而保證代碼簡潔、增加安全。
? 保證代碼的可用性和普適性。多態(見4.2 節)是個有力的工具。
當然,這些思想都是全新的。不過,沿用這些風格對TypeScript 的正常運作有至關重要的作用。TypeScript 內置的下層編譯器支持隻讀類型,有強大的類型推導功能,深置對多態的支持,而且具有完整的結構化類型繫統,這些都促使我們使用良好的編程風格。與底層的JavaScript 相比,TypeScript 在語言層面上仍不失表現力和真實性。
在進入正文之前,還有幾點要說明。
JavaScript 沒有指針和引用的概念,有的隻是值和引用類型。值是不可變的,包括字符串、數字和布爾值;而引用通常指向可變的數據結構,例如數組、對像和函數。本書中出現的“值”,一般不使用它的嚴格定義,而是指JavaScript 值或引用。
注1: 以防你沒接觸過 JavaScript,舉個例子:假如有個對像 o ,我們想為該對像添加一個值為3 的屬性 k;為此,可以直接修改 o,使用o.k = 3 句法,也可以使用 let p ={...o, k: 3} 句法,新建一個對像。
最後,在與JavaScript 互操作時,使用未嚴格遵守類型規定的第三方庫時,維護舊代碼或匆匆上手時,很容易寫出不太理想的TypeScript 代碼。本書的主要目的是教你如何正確編寫TypeScript,告誡你一定要遵守規則。但在實際中,怎麼編寫代碼纔算正確要看你自己或你的團隊。
本書約定
本書采用下述排版約定。
斜體(Italic)
表示新術語、URL、電子郵件地址、文件名和擴展名。
等寬字體(Constant Width)
表示程序清單,在段落中出現則表素,例如變量、函數名、數據類型、環境變量、語句和關鍵字。
斜體等寬字體(Constant Width Italic)
表示應該替換成用戶提供的值,或者由上下文決定的值。
使用代碼示例
本書的補充材料(代碼示例、練習題等)可到https://github.com/bcherny/programming-typescript-answers 下載。
本書是幫你完成工作的。一般來說,如果本書提供了示例代碼,你可以把它用在你的程序或文檔中。除非你使用了很大一部分代碼,否則無需獲得許可。比如,用本書的幾個代碼片段寫一個程序就無需獲得許可,銷售或分發O’Reilly 圖書的示例光盤則需要獲得許可;引用本書中的示例代碼回答問題無需獲得許可,將書中大量的代碼放到你的產品文檔中則需要獲得許可。
我們很希望但並不強制要求你在引用本書內容時加上引用說明。引用說明一般包括書名、作者、出版社和ISBN。比如:“Programming TypeScript by Boris Cherny (O’Reilly). Copyright 2019 Boris Cherny, 978-1-492-03765-1.”。
如果你覺得自己對示例代碼的用法超出了上述許可的範圍, 請通過
permissions@oreilly.com 與我們聯繫。
O’Reilly Online Learning
40 年間,O’Reilly Media 為眾多公司提供技術和商業培
訓,提升知識儲備和洞察力,為企業的成功助力。
我們有一群獨家專家和創新者,他們通過圖書、文章、會議和在線學習平臺分享知識和技術。O’Reilly 的在線學習平臺提供按需訪問的直播培訓課程、詳細的學習路徑、交互式編程環境,以及由O’Reilly 和其他200 多家出版社出版的書籍和視頻。詳情請訪問http://oreilly.com。
聯繫我們
任何有關本書的意見或疑問,請按照以下地址聯繫出版社。
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區西直門南大街2 號成銘大廈C 座807 室(100035)
奧萊利技術咨詢(北京)有限公司
勘誤、示例和其他信息可到https://oreil.ly/programming-typescript 上獲取。
對本書的評論或技術疑問,可以發電子郵件到bookquestions@oreilly.com。
欲了解本社圖書、課程、會議和新聞等更多信息,請訪問我們的網站http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
幾年間斷斷續續的寫作和塗塗畫畫,加上一年的早起晚睡,以及周末和節假日的奮筆疾書,這本書纔得以出版。
感謝O’Reilly 策劃這樣一本書,感謝編輯Angela Rufino 在整個過程中給予我的支持。感謝Nick Nance 對9.2 節的貢獻,感謝Shyam Seshadri 對9.1.2 節的貢獻。感謝技術編輯Daniel Rosenwasser,他是TypeScript 團隊的一員,用了很多時間閱讀草稿,指導我弄清了TypeScript 類型繫統的方方面面。感謝Jonathan Creamer、Yakov Fain、Paul Buying 和Rachel Head 對本書做技術編輯、提供反饋。感謝我的家人Liza、Ilya、Vadim、Roza、Alik、Faina 和Yosif,感謝他們鼓勵纔能使我堅持完成這個項目。
感謝我的伴侶Sara Gilford,在撰寫本書的過程中她始終支持我,即使取消了周末計劃、寫作和編程到深夜,她也沒有怨言,而且主動與我討論類型繫統的復雜細節。如果沒有你,我不可能寫完這本書,你的支持讓我銘記終生。