TypeScript 4.0 發布 - OSCHINA - 中文開源技術交流社區

2021-01-09 開源中國

TypeScript 4.0 現已正式發布,該版本沒有重大的突破性變化。TypeScript 團隊表示新版本繼續使用與過去版本相似的版本控制模型,可將 4.0 視作 3.9 的延續升級版本。而且他們也一直在追求不犧牲主要靈活性的情況下,提供一個最大限度減少 breaking changes 的升級路徑。

事實上,如果你是這個語言的新手,現在是開始使用它的最好時機。社區已經在這裡了,而且還在增長,有工作代碼和偉大的新資源可以學習。有一點要記住:儘管我們在 4.0 中帶來了所有的好東西,但你真的只需要知道 TypeScript 的基礎知識就可以了。

4.0 版本的主要更新內容如下:  

可變參數元組類型 標記的元組元素 構造函數的類屬性推斷 短路分配運算符 catch 子句中的unknown 定製 JSX 工廠 帶--noEmitOnError參數build模式下的速度提升 --incremental with --noEmit 編輯器改進 轉換為可選連結 支持/** @deprecated */ 啟動時的部分編輯模式 更智能的自動導入 Breaking Changes

構造函數的類屬性推斷

當 noImplicitAny 被啟用時,TypeScript 4.0 現在可以使用控制流分(control flow analysis)析來確定類中的屬性類型。

class Square { // Previously: implicit any! // Now: inferred to `number`! area; sideLength; constructor(sideLength: number) { this.sideLength = sideLength; this.area = sideLength ** 2; }}

如果並非將構造函數的所有路徑都分配給實例成員,則該屬性可能被視為undefined。

class Square { sideLength; constructor(sideLength: number) { if (Math.random()) { this.sideLength = sideLength; } } get area() { return this.sideLength ** 2; // ~~~~~~~~~~~~~~~ // error! Object is possibly 'undefined'. }}

在更清楚的情況下(例如具有某種initialize方法),如果位於strictPropertyInitialization中,可能會需要顯式類型注釋以及定值賦值斷言(!)

class Square { // definite assignment assertion // v sideLength!: number; // ^^^^^^^^ // type annotation constructor(sideLength: number) { this.initialize(sideLength) } initialize(sideLength: number) { this.sideLength = sideLength; } get area() { return this.sideLength ** 2; }}

短路分配運算符

JavaScript 和其他很多語言都支持複合賦值運算符。複合賦值運算符將一個運算符應用到兩個參數上,然後將結果賦值到左邊。如下:

/ Addition// a = a + ba += b;// Subtraction// a = a - ba -= b;// Multiplication// a = a * ba *= b;// Division// a = a / ba /= b;// Exponentiation// a = a ** ba **= b;// Left Bit Shift// a = a << ba <<= b;

JavaScript 中的許多運算符都有一個對應的賦值運算符,但有三個例外:邏輯和(&&)、邏輯或(||),以及空值合併(??)。

TypeScript 4.0 為上述三個運算符增加了對應的賦值運算符支持:

let values: string[];// Before(values ?? (values = [])).push("hello");// After(values ??= []).push("hello");

a ||= b;// actually equivalent toa || (a = b);

詳情可查看發布公告。  

相關焦點