TypeScript 2.8引入條件類型
最新發布的TypeScript 2.8包含了若干主要特性和一些問題修復,其中最為重要的是新增了條件類型,開發人員可以根據其他類型的特徵為變數選擇適當的類型。
條件類型最適合與泛型組合在一起使用。如果一個框架總是重複相同的選擇性代碼,就會變得很繁瑣。JavaScript可以在運行時根據具體值做出決策,與之類似,TypeScript的條件類型可以根據其他類型的特徵來做出決策。
TypeScript團隊給出了一個示例,使用更靈活的介面代替原先繁瑣的API:
原先:
interface Id { id: number, /* other fields */ }interface Name { name: string, /* other fields */ }declare function createLabel(id: number): Id;declare function createLabel(name: string): Name;declare function createLabel(name: string | number): Id | Name;
替換為:
type IdOrName = T extends number ? Id : Name;declare function createLabel(idOrName: T): T extends number ? Id : Name;
條件類型提供了infer關鍵字來推斷類型,用於替代手動獲取類型。TypeScript為此提供了一個示例,他們創建了一個叫作Flatten的類型,用於將數組轉成他們需要的元素類型:
type Flatten = T extends any[] ? T[number] : T;
如果使用關鍵字infer就可以將上面的代碼簡化成:
type Flatten = T extends Array ? U : T;
條件類型也為聯合類型帶來了改進,現在可以根據條件類型來分配聯合類型。
另外,TypeScript還增加了若干新的類型別名(Exclude、Extract、InstanceType、NonNullable、ReturnType),這些類型別名也是基於條件類型的。TypeScript團隊因此可以更高效地直接往語言里添加額外的類型模式。
TypeScript 2.8還增加了一個新的--emitDeclarationOnly標記,用於分離TypeScript定義文件和JavaScript文件,從而改進了使用Babel 7轉換TypeScript代碼的過程。
該版本還為React和JSX用戶帶來了一些有關編譯註釋和JSX模塊解析的改進。
現在可以使用-operator或新的Required類型來移除標識符。
其他小改進還包括:用於清理ES模塊導入的輔助工具和對未初始化類屬性檢查的改進。
總體來說,TypeScript 2.8帶來了若干改進,大部分都是基於新引入的條件類型,現在可以定義更複雜的類型。
可以通過npm install -g typescript來安裝最新的TypeScript 2.8,或者直接從GitHub上下載。TypeScript 2.9正在開發中,預計5月下旬發布。
原文地址 http://www.infoq.com/cn/news/2018/04/typescript-2-8-conditional-types
※開源服務容錯處理庫Polly使用文檔
※EntityFramework Core 2.0執行原始查詢如何防止SQL注入?
TAG:dotNET跨平台 |