這篇內容指南:git
-----類型推論github
-----聯合類型typescript
類型推論spa
第一篇中咱們看了TS的基本使用和基本數據類型的使用,知道了變量在使用的時候都得加一個類型,那咱們可不能夠不加呢,這個嘛,能夠也不能夠,爲啥這木說呢,各位看官咱們上眼瞧一下.3d
首先咱們要來先了解一個概念,類型推論:若是沒有明確的指定類型,那麼 TypeScript 會依照類型推論(Type Inference)的規則推斷出一個類型code
例子一:blog
let myFavoriteNumber = 'seven'; myFavoriteNumber = 7; // index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
看吧,沒指定類型報錯了吧。由於這樣賦值等同於ip
let myFavoriteNumber: string = 'seven';get
可是我爲啥說的是能夠也不能夠呢,來,咱們繼續瞧一瞧string
例子二:
let myFavoriteNumber; myFavoriteNumber = 'seven'; myFavoriteNumber = 7;
哎,這樣咋沒報錯,其實在定義的時候沒有賦值,無論以後有沒有賦值,都會被推斷成 any
類型而徹底不被類型檢查
這就是JS的類型推論,是否是美滋滋,這樣媽媽就不再擔憂我參數類型傳的有問題了
聯合類型
咱們想一想會不會有這個情景,一個變量咱們既容許他是string又能夠是number,那咱們怎麼辦呢,用any嗎?顯然是不行的,用any那不是什麼類型都能傳進去了,那咱們怎麼作呢,這裏就又要亮出一個概念了
這就是咱們要說的聯合類型,這個概念一看就知道是把幾個類型聯合起來,那怎麼實現啵,跟概念同樣簡潔明瞭
let Adam:string | number Adam = 'seven'; Adam = 7 let Sh:string | number Sh = true // index.ts(2,1): error TS2322: Type 'boolean' is not assignable to type 'string | number'. // Type 'boolean' is not assignable to type 'number'.
聯合類型使用 |
分隔每一個類型。
注意:當 TypeScript 不肯定一個聯合類型的變量究竟是哪一個類型的時候,咱們只能訪問此聯合類型的全部類型裏共有的屬性或方法
function getLength(something: string | number): number { return something.length; } // index.ts(2,22): error TS2339: Property 'length' does not exist on type 'string | number'. // Property 'length' does not exist on type 'number'.
上述例子會報錯,是由於length並非string和number的公共方法
訪問 string
和 number
的共有屬性是沒問題的:
function getString(something: string | number): string { return something.toString(); }
聯合類型的變量在被賦值的時候,會根據類型推論的規則推斷出一個類型:
let myFavoriteNumber: string | number; myFavoriteNumber = 'seven'; console.log(myFavoriteNumber.length); // 5 myFavoriteNumber = 7; console.log(myFavoriteNumber.length); // 編譯時報錯 // index.ts(5,30): error TS2339: Property 'length' does not exist on type 'number'.
上例中,第二行的 myFavoriteNumber
被推斷成了 string
,訪問它的 length
屬性不會報錯。
而第四行的 myFavoriteNumber
被推斷成了 number
,訪問它的 length
屬性時就報錯了。
原文參考自:https://github.com/xcatliu/typescript-tutorial/blob/master/basics/union-types.md