譯者注:可能大家更關心的是 〔譯〕TypeScript 2.0 的新特性
[原文]
TypeScript 2.0 is now available!
September 22, 2016 by Daniel Rosenwasser
今天非常高興的通知大家,TypeScript 2.0 正式版釋出了!
TypeScript 2.0 對於產品團隊來說是個偉大的歷程,這個歷程少不了來自社群和合作夥伴的貢獻。這個版本帶來了一些新的特性,可以提高開發人員的開發效率。這個版本使 TypeScript 更加接近 ECMAScript 的發展,為 JavaScript 庫和工具提供了更為廣泛的支援。它通過編輯類工具,帶來了先進的編輯體驗,增強了語言服務。
要使用 TypeScript 2.0,可以下載 TypeScript 2.0 for Visual Studio 2015 (需要更新到 Update3),或者從 NuGet 獲取,或者在 Visual Studio Code 中使用 TypeScript 2.0,或者通過 NPM 安裝:
npm install -g typescript@2.0
要在 Visual Studio “15” 預覽版使用 TypeScript 2.0 需要等到下一個預覽版釋出。
2.0 歷程
幾年前我就們踏上了 2.0 版本的歷程。TypeScript 1.0 成功地向開發人員展示了 JavaScript 與靜態型別結合和潛能。編譯器的錯誤檢查節約了大量用於查詢 BUG 的時間。在開發者們開始建立越來越大的 JavaScript 應用時,TypeScript 的編輯器類工具帶來了巨大的開發效率提升。然而 JavaScript 是世界上最流行最廣泛使用的語言,作為它的超集,TypeScript 還有很長的路要走。
TypeScript 1.1 完全重寫了編譯器,這帶來4倍效率提升。新的編譯器核心更加靈活,更快速地迭代,這為以後的版本打下了基礎。幾乎同時,TypeScript 程式碼庫遷移到 GitHub,這個鼓勵社群參與並提供了更好協作平臺地方。
TS 1.4 和 1.5 主要致力於支援 ES2015/ES6,以期與 JavaScript 語言的發展同步。TypeScript 1.5 還引入了對模組和修飾符〔譯者注:類似 Java 中的”註解(Annotation)”,C# 中的“特性(Attribute)”〕,允許 Angular 2 採用 TypeScript,並與我們的合作一起改進 TypeScript。
TypeScript 1.6-1.8(1.6, 1.7, 1.8) 對型別系統進行了重大改進,每一個版本的釋出都讓 JavaScript 模式更加清晰,同時也為主要的 JavaScript 庫提供支援。這些釋出版本同樣圍繞著對 ES* 的支援,並在快速(譯者注:原文 out-of-the-box 是開箱即用的意思,引申為快速)檢查錯誤方面提升了編譯器,使之先進不少。
今天,TypeScript 語言 2.0 釋出讓我們激動不已。在這個版本的 TypeScript 更加接近 ECMAScript 規範,更廣泛地支援 JavaScript 庫和工具,以及非常棒的語言服務用以向所有主要編輯器提供最佳的編輯體驗。所以有些合在一起,就能提供最更高效,更靈活的 JavaScript 開發體驗。
TypeScript 社群
從 1.0 開始,TypeScript 就不只是一門語言,它也成長成一個社群。僅上個月,TypeScript 在 NPM 上就有 200 萬的下載量,而去年同期只有 27.5 萬。此外,我們的每日構建版本吸引了超過 2000 使用者在 GibHub 上參與討論,以及 1500 使用者提交問題。我們也接受了來自 150 餘位使用者的 PR〔譯者注:Pull Request〕,範圍包括修復BUG、原型和主要特性等。
DefinitelyTyped 是我們的社群發展越來越好的另一個例子。它從一個關於申明檔案(用 TypeScript 描述你的 JS 庫介面的檔案)的小程式碼庫開始,現在已經包含超過 2000 個庫的申明,這些申明是 2500 多個人捐獻的手工程式碼。它是目前我們所知道的最大的正規申明。通過建立 DefinitelyTyped,TypeScript 社群變得不僅僅支援使用已經存在的 JavaScript 庫,還更好的定義了我們所有 JavaScript 程式碼的理解。
TypeScript 社群和更大的 JavaScript 社群為 TypeScript 迄今為止取得的成功發揮了重要作用。無論你捐獻程式碼、宣傳、測試、提交問題,還是在專案中使用 TypeScript,我們都對你的長期支援表示感謝!
TypeScript 2.0 有什麼新鮮玩意兒?
TypeScript 2.0 帶來了一些 1.8 所不具有的新特性,其中一些我們已經在 2.0 Beta 版和候選版的部落格中詳細說明了。下面會介紹一些現在剛具備的重要特性。你可以在我們的 WIKI 上閱讀推斷型別、never
型別、用於函式的 this 型別、tsconfig 對 glob 的支援 等。
獲取簡易申明檔案 (.d.ts)
typings 和 tsd 已經成為TypeScript 生態系統中極好的工具。直到現在,這些包管理工具幫助使用者快速地從 DefinitelyTyped 取得 .d.ts 檔案,用於他們的專案。雖然有這些工具,對新使用者來說,學習如何通過這些包管理工具獲得和管理申明檔案的依賴關係仍然是件痛苦的事情。
在 2.0 中獲取和使用申明檔案會更容易,比如想獲取 lodash 的申明檔案,只需要使用 NPM:
npm install -s @types/lodash
上面的命名安裝了一個範圍包 @type/lodash,這使得 TypeScript 2.0 能在程式中匯入(import
) lodash 時自動引用 lodash 的申明。這就是說你不需要其它工具,你的 .d.ts 檔案就能找到 package.json 中剩下的依賴。
值得注意的是,typeing 和 tsd 能在已經存在的專案裡繼續使用,然而相容 2.0 的申明檔案不再會再通過這些工具生效。因此,我們強烈推薦使用 TypeScript 2.0 及以後版本的 NPM 流程。
非常感謝 Blake Embrey 在 typings 的工作,是他的工作推進了這項解決方案。
非空型別
JavaScript 有兩個值用於表示“空”——null
和 undefined
。如果 null
是一個價值十億美元的錯誤,undefined
會給我們帶來加倍的損失。在 JavaScript 的世界,這兩個值是巨大的錯誤來源,因為使用者經常會忘記分辨 API 中返回的 null
或 undefined
值。
TypeScript 最初的想法是所有型別都是可空的。這就是說,某個數值型別也可能出現 null
或 undefined
值。很不幸,這並不能很好的解決 null
/undefined
的問題。
在 TypeScript 2.0 中,null
and undefined
擁有它們自己的型別,這讓開發者可以明確的表達是否允許 null
/undefined
。現在如果某個東西可以是數值或者 null
值,你可以使用聯合型別 number | null
(讀作“number 或 null”)。
因為這是一個破壞性的改變,我們選項裡新增了 --strictNullChecks
模式來允許這種行為。然後在往後的發展中,開啟這個選項會成為一個一般的最佳實踐,這有肋於捕捉大範圍的 null
/undeined
錯誤。如果想閱讀更多關於非空型別的資訊,請移步 GitHub 上的 Pull Request。
控制流程分析的型別
從 1.8 開始,TypeScript 就已經存在控制流分析,但是從 2.0 開始我們擴充套件了分析範圍,以對於在任何地方都能分析出可能的型別。現在,配合非空型別,TypeScript 能做更多複雜的檢查,比如明確的賦值分析。
function f(condition: boolean) {
let result: number;
if (condition) {
result = computeImportantStuff();
}
// 哇哦! `result` 可能從未初始化!
return result;
}
非常感謝 Ivo Gabe de Wolff 對這個特性初期的貢獻以及後來提供的大量反饋。你可以在 PR 中閱讀更多資訊。
readonly
修飾詞
TypeScript 中的不可變程式設計變得容易了。從 TypeScript 2.0 開始,你可以定義屬性為只讀。
class Person {
readonly name: string;
constructor(name: string) {
if (name.length < 1) {
throw new Error("Empty name!");
}
this.name = name;
}
}
// 錯誤!`name` 是隻讀的。
new Person("Daniel").name = "Dan";
所有沒有匹配設定器的獲取器都被認為是隻讀的。
展望
TypeScript 從 JavaScript 而來。正如現在成千上成的 JavaScript 開發者所知道的那樣,TypeScript 開始於 JavaScript 相同的語法和語義,允許開發者使用已經存在的 JavaScript 程式碼,使用流行的 JavaScript 庫,也可以從 JavaScript 中呼叫 TypeScript 程式碼。JavaScript 可選的靜態型別使 JavaScript 開發者在開發 JavaScript 應用時,可以使用高效的開發工工具和實踐,比如靜態檢查,反射等。
我們會聯合合作伙伴和社群的力量繼續發展 JavaScript 的型別系統,讓使用者可以更深層次的將靜態型別方法用於 JavaScript。同時,我們會致力於提高 TypeScript 語言服務和一系列的工具特性,使開發工具變得更智慧,以提高開發者的工作效率。
向所有一路走來到 2.0 的人致謝!你們的反饋和熱情帶來了 TypeScript 及其生態如今的成就。希望你們對 2.0 的興奮程度不亞於我們。
如果你還未使用 TypeScript,一定試試!我們非常願意聽到你的聲音。
祝愉快
TypeScript 團隊