元組和陣列上的對映型別
在 TypeScript 3.1 中,作用於元組和陣列上的對映物件型別[1] 現在會產生新的元組/陣列,而不是建立一個成員(如 push()、pop() 和 length)被轉換過的新型別。例如
tstype MapToPromise<T> = { [K in keyof T]: Promise<T[K]> };type Coordinate = [number, number];type PromiseCoordinate = MapToPromise<Coordinate>; // [Promise<number>, Promise<number>]
MapToPromise 接收一個型別 T,當該型別為類似 Coordinate 的元組時,只有數值屬性會被轉換。在 [number, number] 中,有兩個數值命名屬性:0 和 1。當給定這樣的元組時,MapToPromise 將建立一個新的元組,其中 0 和 1 屬性是原型別的 Promise。因此,最終型別 PromiseCoordinate 的結果型別為 [Promise<number>, Promise<number>]。
函式上的屬性宣告
TypeScript 3.1 帶來了在函式宣告和 const 宣告的函式上定義屬性的能力,只需在同一作用域內對這些函式上的屬性進行賦值即可。這使我們能夠編寫規範的 JavaScript 程式碼,而無需訴諸 namespace 這種 hack 手段。例如
tsfunction readImage(path: string, callback: (err: any, image: Image) => void) {// ...}readImage.sync = (path: string) => {const contents = fs.readFileSync(path);return decodeImageSync(contents);};
在這裡,我們有一個函式 readImage,它以非阻塞的非同步方式讀取影像。除了 readImage,我們還在 readImage 本身提供了一個名為 readImage.sync 的便利函式。
雖然 ECMAScript 匯出通常是提供此功能的更好方法,但這種新的支援使以這種風格編寫的程式碼能夠在 TypeScript 中“直接工作”。此外,這種屬性宣告方法使我們能夠在 React 函式元件(以前稱為 SFC)上表達常見的模式,如 defaultProps 和 propTypes。
tsexport const FooComponent = ({ name }) => <div>Hello! I am {name}</div>;FooComponent.defaultProps = {name: "(anonymous)",};
[1] 更具體地說,是上述形式中的同態對映型別。
使用 typesVersions 進行版本選擇
來自社群的反饋以及我們自己的經驗表明,在利用最新的 TypeScript 特性的同時還要兼顧使用舊版本的使用者是非常困難的。TypeScript 引入了一個名為 typesVersions 的新功能來幫助應對這些場景。
您可以在 宣告檔案部分的“釋出”章節 中瞭解更多相關資訊。