TypeScript 可辨識聯合型別
可以合併字串字面量型別,聯合型別,型別保護和型別別名來建立一個叫做可辨識聯合型別。
TypeScript基於已有的JavaScript模式, 具有3個要素:
(1).具有普通字串字面量屬性—可辨識的特徵。
(2).一個型別別名包含型別的聯合—聯合。
(3).此屬性上的型別保護。
程式碼例項:
[typescript] 純文字檢視 複製程式碼interface Square { kind: "square"; size: number; } interface Rectangle { kind: "rectangle"; width: number; height: number; } interface Circle { kind: "circle"; radius: number; }
宣告三個介面,每個介面都有kind屬性,但有不同的字串字面量型別, kind屬性稱做可辨識的特徵或標籤,其它的屬性則特定於各個介面。
[typescript] 純文字檢視 複製程式碼type Shape = Square | Rectangle | Circle;
將三個型別聯合起來,組成一個聯合型別,並重新命名。
[typescript] 純文字檢視 複製程式碼function area(shape: Shape) { switch (shape.kind) { case "square": return shape.size * shape.size; case "rectangle": return shape.height * shape.width; case "circle": return Math.PI * shape.radius ** 2; } }
通過型別保護,實現辨識聯合型別中的每一個型別;關於型別保護參閱TypeScript 型別保護一章節。
完整性檢查:
當沒有涵蓋所有可辨識聯合的變化時,想讓編譯器可以通知我們。
例如,如果新增Triangle到Shape,同時還需要更新area:
[typescript] 純文字檢視 複製程式碼type Shape = Square | Rectangle | Circle | Triangle; function area(s: Shape) { switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; case "circle": return Math.PI * s.radius ** 2; } // 應該報錯,因為沒有處理Triangle }
有兩種方式可以實現。 首先是啟用--strictNullChecks並且指定一個返回值型別:
[typescript] 純文字檢視 複製程式碼function area(s: Shape): number { // error: returns number | undefined switch (s.kind) { case "square": return s.size * s.size; case "rectangle": return s.height * s.width; case "circle": return Math.PI * s.radius ** 2; } }
因為switch沒有包涵所有情況,所以TypeScript認為這個函式有時候會返回undefined。
如果明確地指定了返回值型別為number,那麼看到一個錯誤,因為實際上返回值的型別為number | undefined。 然而,這種方法存在些微妙之處且--strictNullChecks對舊程式碼支援不好。
第二種方法使用never型別,編譯器用它來進行完整性檢查:
[typescript] 純文字檢視 複製程式碼function assertNever(x: never): never { throw new Error("Unexpected object: " + x); } function area(shape: Shape) { switch (shape.kind) { case "square": return shape.size * shape.size; case "rectangle": return shape.height * shape.width; case "circle": return Math.PI * shape.radius ** 2; default: return assertNever(shape); // error here if there are missing cases } }
assertNever檢查shape是否為never型別—即為除去所有可能情況後剩下的型別。
如果忘記了某個case,那麼shape將具有一個真實的型別並且你會得到一個錯誤。 這種方式需要定義一個額外的函式,但是在你忘記某個case的時候也更加明顯。
相關文章
- TypeScript 聯合型別TypeScript型別
- typeScript 型別斷言、聯合型別和交叉型別(七)TypeScript型別
- 系統學習 TypeScript(五)——聯合型別TypeScript型別
- TypeScript中,如何利用陣列生成一個聯合型別TypeScript陣列型別
- Typescript 下 Mongoose 外來鍵型別&外來鍵陣列型別定義&型別保護&聯合型別理解TypeScriptGo型別陣列
- TypeScript 3.3釋出:改進了聯合型別呼叫和構建時間TypeScript型別
- TypeScript this型別TypeScript型別
- TypeScript 泛型型別TypeScript泛型型別
- TypeScript 型別相容TypeScript型別
- TypeScript 交叉型別TypeScript型別
- Typescript:基本型別TypeScript型別
- TypeScript 字串型別TypeScript字串型別
- TypeScript Never型別TypeScript型別
- TypeScript Any型別TypeScript型別
- TypeScript 索引型別TypeScript索引型別
- TypeScript 型別安全TypeScript型別
- TypeScript type 型別別名TypeScript型別
- TS資料型別:型別別名/聯合型別/字面量型別/型別推論等綱要資料型別
- TypeScript 型別系統TypeScript型別
- Typescript高階型別TypeScript型別
- TypeScript 型別保護TypeScript型別
- TypeScript 型別推斷TypeScript型別
- TypeScript 型別斷言TypeScript型別
- TypeScript void 型別TypeScript型別
- TypeScript 陣列型別TypeScript陣列型別
- TypeScript 函式型別TypeScript函式型別
- TypeScript 數值型別TypeScript型別
- TypeScript 布林型別TypeScript型別
- TypeScript Widened型別TypeScriptIDE型別
- TypeScript 對映型別TypeScript型別
- TypeScript 元組型別TypeScript型別
- TypeScript 字面量型別TypeScript型別
- TypeScript資料型別TypeScript資料型別
- TypeScript型別系統和基礎型別TypeScript型別
- TypeScript-----資料型別TypeScript資料型別
- 【譯】TypeScript 的型別(一)TypeScript型別
- TypeScript 字串字面量型別TypeScript字串型別
- TypeScript 混合型別介面TypeScript型別