TypeScript 3.1增加可對映元組和陣列型別
TypeScript團隊ofollow,noindex" target="_blank">最近釋出了TypeScript版本3.1 ,繼3.0版本之後添加了可對映元組和陣列型別以及其他一些改進。
幾乎每個JavaScript應用程式都需要對映列表中的值,這種模式在ES2015中通過剩餘引數進行了簡化。
TypeScript團隊提供的一個常見示例:
function stringifyAll(...elements) { return elements.map(x => String(x)); }
根據TypeScript部落格所述:
stringifyAll函式可以接受任意數量的值,將每個元素轉換為字串,將每個結果放在一個新陣列中,然後返回該陣列。如果我們想要stringifyAll具有最通用的類型,需要將其宣告為:
declare function stringifyAll(...elements: unknown[]): Array<string>;
在這個例子中,函式接受任意數量的元素,並返回一個字串陣列,但是有關元素數量的型別資訊將會丟失。以前的解決方案是過載函式定義,這樣很不方便:
declare function stringifyAll(...elements: []): string[]; declare function stringifyAll(...elements: [unknown]): [string]; // ... etc.
TypeScript已在之前的版本中引入了對映物件型別,但不能完美應用於元組和陣列型別。新版本的變化是這個方法現在可以按預期工作,而不會丟擲異常。
根據TypeScript部落格所述:
從技術層面看,行為可以保持一致,我們團隊的大部分人認為這種用法是沒有問題的。在迭代元組和陣列時,對映物件型別現在可以“做正確的事”,並沒有引入用於對映元組的新概念。這意味著如果你已經在使用現有的對映型別(如Partial或者lib.d.ts中的Required),它們會立即自動處理元組和陣列。雖然非常通用,但你可能會注意到這個功能意味著TypeScript現在可以更好地表達類似於Promise.all的函式。雖然這一變更尚未被包含在這一版本中,但會在不久的將來出現。
3.1版本的另一個重要補充是簡化了在函式宣告上指定屬性。React使用者對此應該很熟悉,它類似於defaultProps。
因為函式在JavaScript中也是物件,所以可以很容易地向函式新增屬性。TypeScript最初的解決方案是使用名稱空間,但在與ES模組一起用時帶來了一些挑戰,而且無法與var、let或const進行合併宣告。
在TypeScript 3.1中,通過函式初始化進行的函式宣告或const宣告都會導致型別檢查器分析父作用域,以便跟蹤新新增的屬性。
3.1版本還包含了很多其他較小的變更和增強功能。
在3.1版本之外,TypeScript 3.2版本將帶來更多改進。最大的一個改進是函式的嚴格繫結、呼叫和方法應用 ,這是社群近四年前要求新增 的複雜增強功能。這個增強解決了部分與變元 相關的問題,變元相關問題是支援高階函式型別最具挑戰性的問題集合。BigInt支援 也是3.2版本的一部分。
TypeScript是基於Apache 2許可的開源軟體,可以通過TypeScript GitHub專案 主頁參與貢獻和反饋。