歡迎您光臨本站 註冊首頁

TypeScript 3.6 發布,微軟腳本編程語言

←手機掃碼閱讀     admin @ 2019-08-30 , reply:0

TypeScript 3.6 已經發布了,更新內容如下:

使用更嚴格的生成器(Stricter Generators)

TypeScript 3.6 引入了對迭代器和生成器函數(generator functions)的更嚴格檢查。在早期版本中,生成器的使用者無法區分一個值是來自 yield 操作或是從生成器返回。

另外,生成器僅僅假設 yield 類型是任意的:

以第一段代碼為例,在 TypeScript 3.6 中,檢查器會知道 curr.value 的正確類型應為 string,並在最後一個示例中糾正對 next() 的錯誤調用。這要歸功於因在IteratorIteratorResult類型聲明中進行的一些更改而引入部分新的類型參數,以及 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 中使用。

Improved UX Around Promises

Promise 是當前處理非同步數據的最常見方法之一,不幸的是,使用Promise面向對象的 API 通常會讓使用者感到困惑。因此針對Promise被錯誤處理的情況,TypeScript 3.6 引入了一些改進。

例如,在將其傳遞給另一個函數之前,Promise忘記.then()或者await內容通常是很常見的。TypeScript 的錯誤消息現在是專用的,並告知使用者他們可能應該考慮使用await關鍵字。

另外還提供快速修復:

更好的 Unicode 支持標識符

當發射到 ES 2015或其他時,3.6 版本包含更好地支持標識符中的 Unicode 字元:

在 SystemJS 中支持 import.meta

3.6 版本支持在將 module 目標設置為 system 時,將 import.meta 轉換為 context.meta。

get and set Accessors Are Allowed in Ambient Contexts

在早期版本的 TypeScript 中,並不允許在環境上下文中 set 和 get 訪問器,其基本原理是,就寫入和讀取這些屬性而言,訪問器與屬性並沒有區別;然而,由於 ECMAScript 的類欄位提案可能與現有版本的 TypeScript 中的行為不同,則需要一種方法來溝通這種不同的行為,以便在子類中提供適當的錯誤。

因此 TypeScript 3.6 中,用戶可以在環境上下文中編寫 getter 和 setter。

環境類和函數可以合併

在以前版本中,在任何情況下合併類和函數都是有錯的。此版本中,環境類和函數(帶有 declare 修飾符的類/函數,或 .d.ts 文件中的類/函數)可以合併。如下內容:

而不需要使用:

它的一個優點是可以輕鬆地表達可調用的構造函數模式,同時允許名稱空間與這些聲明合併(因為 var 聲明不能與名稱空間合併)。

APIs to Support --build and --incremental

TypeScript 3.6 增加了兩組用於操作項目引用和增量式程序構建的 API。

對於 --incremental,用戶可以使用 createIncrementalProgram 和 createIncrementalCompilerHost API。用戶還可以使用新的 readBuilderProgram 函數從該 API 生成的 .tsbuildinfo 文件中重新補充舊的程序實例,該函數僅用於創建新程序(即不能修改返回的實例,它僅用於其他 Create*Program 函數中的oldProgram 參數)。

New TypeScript Playground

此版本中,新的 TypeScript playground 支持許多新的選擇,包括:

  • target 選項(允許用戶從 ES5 切換到 ES3、es2015、esnext 等)

  • 所有標記(包括 strict)

  • 對普通 JavaScript 文件的支持(使用 allowJS 和 CheckJS)

當共享鏈接到 playground 示例時,這些選項也會持續存在,這樣用戶就可以更可靠地共享示例。

Semicolon-Aware Code Edits

像 Visual Studio 和 Visual Studio Code 這樣的編輯器可以自動應用快速修復、重構和其他轉換,比如從其他模塊自動導入值。這些轉換由 TypeScript 驅動,老版本的 TypeScript 無條件地在每條語句的末尾添加分號;不幸的是,這不符合許多用戶的樣式指南,許多用戶對編輯器插入分號不滿意。

在此版本中,在應用這類編輯時,TypeScript 可以檢測文件是否使用分號。如果你的文件是缺少分號,TypeScript 則不會添加分號。

Smarter Auto-Imports

JavaScript 有許多不同的模塊語法或約定:ECMAScript 標準、Node 支持的模塊語法或約定(CommonJS)、AMD、System.js 等等。在大多數情況下,TypeScript 將默認使用 ECMAScript 模塊語法自動導入,在具有不同編譯器設置的某些 TypeScript 項目中,或者在具有普通 JavaScript 和 Require 調用的 Node 項目中,這通常是不合適的。

在 3.6 版本中,在決定如何自動導入其他模塊之前,它會查看現有的導入。

Breaking Changes

類成員 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 ]

來源:OsChina
連結:https://www.oschina.net/news/109456/typescript-3-6-released
TypeScript 3.6 發布,微軟腳本編程語言已經有158次圍觀

http://coctec.com/news/all/show-post-213265.html