TypeScript 3.6 已經發布了,更新內容如下:
TypeScript 3.6 引入了對迭代器和生成器函數(generator functions)的更嚴格檢查。在早期版本中,生成器的使用者無法區分一個值是來自 yield 操作或是從生成器返回。
另外,生成器僅僅假設 yield 類型是任意的:
以第一段代碼為例,在 TypeScript 3.6 中,檢查器會知道 curr.value 的正確類型應為 string,並在最後一個示例中糾正對 next() 的錯誤調用。這要歸功於因在Iterator
和IteratorResult
類型聲明中進行的一些更改而引入部分新的類型參數,以及 TypeScript 用於代表稱為Generator
類型的生成器。
該版本中 Iterator 類型允許用戶說明 yield 類型、返回的類型和 next 可以接受的類型。
在此基礎上,新類型 Generator 是一個 Iterator,它同時存在 return 和 throw 方法,並且是可迭代的。
為了區分返回的值和生成的值,TypeScript 3.6 將 IteratorResult 類型轉換為聯合類型:
type IteratorResult= IteratorYieldResult| IteratorReturnResult; interface IteratorYieldResult{ done?: false; value: TYield; } interface IteratorReturnResult{ done: true; value: TReturn; }
簡而言之,這意味著在直接處理迭代器時,將能夠適當地縮小迭代器的值。
為了正確表示可以從調用 next( ) 傳入生成器的類型,TypeScript 3.6 還可以推斷生成器函數主體內的某些 yield 用途。
如果你希望顯式,還可以使用顯式返回類型從 yield 表達式強制執行返回、yield 和計算的值的類型。如下,只能用布爾值調用 next( ),並且取決於 done 的值,value 要麼是 string,要麼是 number。
/** * - yields numbers * - returns strings * - can be passed in booleans */ function* counter(): Generator{ let i = 0; while (true) { if (yield i++) { break; } } return "done!"; } var iter = counter(); var curr = iter.next() while (!curr.done) { console.log(curr.value); curr = iter.next(curr.value === 5) } console.log(curr.value.toUpperCase()); // prints: // // 0 // 1 // 2 // 3 // 4 // 5 // DONE!
在默認情況下,TypeScript 使用一個更簡單的發射,它只支持數組類型,並支持使用 --downlevelIteration 標誌在其他類型上進行迭代。在此標誌下,發出的代碼更準確,但要大得多。但是,在某些邊緣情況下,受支持的數組還是存在一些差異,如下:
[...Array(5)]
等效於以下數組:
[undefined, undefined, undefined, undefined, undefined]
但是,TypeScript 將原始代碼轉換為以下代碼:
Array(5).slice();
這是不一樣的,Array(5) 生成長度為 5 的數組,但沒有屬性:
當 TypeScript 調用 Slice( ) 時,它還會創建一個數組,其中包含尚未設置的索引。
3.6 版本引入了一個新的 __spreadArrays 助手,用於精確地模擬 ECMAScript 2015 中在 --downlevelIteration 之外中發生的情況。__SpreadArray 也可在 tslib 中使用。
Promise 是當前處理非同步數據的最常見方法之一,不幸的是,使用Promise
面向對象的 API 通常會讓使用者感到困惑。因此針對Promise
被錯誤處理的情況,TypeScript 3.6 引入了一些改進。
例如,在將其傳遞給另一個函數之前,Promise
忘記.then()
或者await
內容通常是很常見的。TypeScript 的錯誤消息現在是專用的,並告知使用者他們可能應該考慮使用await
關鍵字。
另外還提供快速修復:
當發射到 ES 2015或其他時,3.6 版本包含更好地支持標識符中的 Unicode 字元:
3.6 版本支持在將 module 目標設置為 system 時,將 import.meta 轉換為 context.meta。
在早期版本的 TypeScript 中,並不允許在環境上下文中 set 和 get 訪問器,其基本原理是,就寫入和讀取這些屬性而言,訪問器與屬性並沒有區別;然而,由於 ECMAScript 的類欄位提案可能與現有版本的 TypeScript 中的行為不同,則需要一種方法來溝通這種不同的行為,以便在子類中提供適當的錯誤。
因此 TypeScript 3.6 中,用戶可以在環境上下文中編寫 getter 和 setter。
在以前版本中,在任何情況下合併類和函數都是有錯的。此版本中,環境類和函數(帶有 declare 修飾符的類/函數,或 .d.ts 文件中的類/函數)可以合併。如下內容:
而不需要使用:
它的一個優點是可以輕鬆地表達可調用的構造函數模式,同時允許名稱空間與這些聲明合併(因為 var 聲明不能與名稱空間合併)。
TypeScript 3.6 增加了兩組用於操作項目引用和增量式程序構建的 API。
對於 --incremental,用戶可以使用 createIncrementalProgram 和 createIncrementalCompilerHost API。用戶還可以使用新的 readBuilderProgram 函數從該 API 生成的 .tsbuildinfo 文件中重新補充舊的程序實例,該函數僅用於創建新程序(即不能修改返回的實例,它僅用於其他 Create*Program 函數中的oldProgram 參數)。
此版本中,新的 TypeScript playground 支持許多新的選擇,包括:
target 選項(允許用戶從 ES5 切換到 ES3、es2015、esnext 等)
所有標記(包括 strict)
對普通 JavaScript 文件的支持(使用 allowJS 和 CheckJS)
當共享鏈接到 playground 示例時,這些選項也會持續存在,這樣用戶就可以更可靠地共享示例。
像 Visual Studio 和 Visual Studio Code 這樣的編輯器可以自動應用快速修復、重構和其他轉換,比如從其他模塊自動導入值。這些轉換由 TypeScript 驅動,老版本的 TypeScript 無條件地在每條語句的末尾添加分號;不幸的是,這不符合許多用戶的樣式指南,許多用戶對編輯器插入分號不滿意。
在此版本中,在應用這類編輯時,TypeScript 可以檢測文件是否使用分號。如果你的文件是缺少分號,TypeScript 則不會添加分號。
JavaScript 有許多不同的模塊語法或約定:ECMAScript 標準、Node 支持的模塊語法或約定(CommonJS)、AMD、System.js 等等。在大多數情況下,TypeScript 將默認使用 ECMAScript 模塊語法自動導入,在具有不同編譯器設置的某些 TypeScript 項目中,或者在具有普通 JavaScript 和 Require 調用的 Node 項目中,這通常是不合適的。
在 3.6 版本中,在決定如何自動導入其他模塊之前,它會查看現有的導入。
類成員 constructor 現在是構造函數
根據 ECMAScript 規範,名為 constructor 的方法的類聲明現在是構造函數,無論它們是使用標識符名稱聲明,還是使用字元串名稱聲明。
DOM 更新
在 lib.dom.d.ts 中已經刪除或更改了許多聲明,這包括(但不限於)以下內容:
全局 window 不再定義為類型 Window,而是定義為類型 Window & type of globalThis。在某些情況下,將其類型稱為 typeof window
GlobalFetch 移除了,而是使用 WindowOrWorkerGlobalScope
Navigator 上的某些非標準屬性已經消失
experimental-webgl 移除了,而是使用 webgl
和 webgl2
JSDoc 註解不再合併
在 JavaScript 文件中,TypeScript 只會在緊接 JSDoc 註解之前確定聲明的類型。
關鍵字不能包含轉義序列
以前,關鍵字被允許包含轉義序列。3.6 版本不再允許:
關於 TypeScript 3.6 更多信息,請見 TypeScript 網站。使用 npm 命令獲取:
npm install -g typescript
還可以通過以下方式獲得編輯器支持:
發布說明:
https://devblogs.microsoft.com/typescript/announcing-typescript-3-6/
[admin
]