高級類型
? ? 1 交叉類型
? ??????交叉類型是將?多個類型合并為一個類型, 也就是 幾種類型之和;
? ? ? ? 它把現(xiàn)有的多種類型疊加到一起成為一種類型,它包含了所需的所有類型的特性

? ? 2 聯(lián)合類型
? ??????聯(lián)合類型表示一個值可以是?幾種類型之一,用豎線(?| )分隔每個類型;


? ??????如果一個值是聯(lián)合類型,我們?只能?訪問此聯(lián)合類型的所有類型里?共有的成員。

? ? 3 類型保護
? ? ? ?類型保護就是一些表達式,它們會在運行時檢查以確保在某個作用域里的類型。
? ??????類型謂詞

? ???????pet is Fish 就是類型謂詞。 謂詞為?parameterName is Type 這種形式,?parameterName 必須是來自于當前函數(shù)簽名里的一個參數(shù)名。
? ??????typeof 類型保護

? ??????????????這些*?typeof 類型保護*只有兩種形式能被識別:?typeof v === "typename"和?typeof v !== "typename",?"typename" 必須是?"number",?"string",?"boolean" 或?"symbol"。 但是TypeScript并不會阻止你與其它字符串比較,語言不會把那些表達式識別為類型保護。
? ??????instanceof 類型保護

可以為null的類型
? ??類型檢查器認為?null 與?undefined 可以賦值給任何類型;???
????null 和 undefined 是?所有類型的子類型。 就是說可以把?null 和 undefined 賦值給 任何類型的變量。
? ??由于可以為 null 的類型是通過聯(lián)合類型實現(xiàn),那么你需要使用類型保護來去除?null;

? ??如果編譯器不能夠去除?null 或?undefined,可以使用類型斷言手動去除。 語法是添加?!后綴:?identifier! 從?identifier 的類型里去除了?null和?undefined, 可以手動保證它不是 null 或者??undefined。

字符串字面量類型
? ??????字符串字面量類型允許你指定字符串必須的?固定值。?在實際應用中,字符串字面量類型可以與聯(lián)合類型,類型保護和 類型別名 很好的配合。 通過結合使用這些特性,你可以實現(xiàn)?類似枚舉類型的字符串。

索引類型
? ??索引類型查詢操作符 keyof

? ???索引訪問操作符
? ??????????getProperty 里的?o: T 和?name: K,意味著?o[name]: T[K]。 當你返回?T[K] 的結果,編譯器會實例化鍵的真實類型,因此?getProperty 的返回值類型會隨著你需要的屬性改變;
? ??????????? person['name']具有類型?Person['name']?— 例子里則為?string 類型


? ??索引類型 和 字符串索引簽名
? ??????keyof 和?T[K] 與字符串索引簽名進行交互。 如果你有一個帶有字符串索引簽名的類型,那么?keyof T會是?string。 并且?T[string] 為索引簽名的類型:
