首先介紹聯合型別
let testStr: number | string = '1111111' // 函式使用聯合型別 const fn = function (name: string | number): number { return 1111 }
那麼什麼是交叉型別呢
多種型別的集合,聯合物件將具有所聯合型別的所有成員
interface person { name: string, age: number } interface Man { sex: number } // 這裡使用&符號連線型別 const objPerson: person & Man = { name: 'momo', age: 7, sex: 1 } // 函式使用 const testFN = (man: person & Man): void =>{ console.log('man :>> ', man); }
型別斷言
語法介紹:值 as 型別 或 <型別>值 value as string <string>value
interface A { run: string } interface B { build: string } const testFn = (type: A | B): string => {
// 這裡這麼寫會報錯 return type.run } // 這個時候可以使用型別斷言來推斷他傳入的是哪個資料 // 改造如下: const testFn1 = (type: A | B): string => { return (type as A).run }
需要注意的是,型別斷言只能夠「欺騙」TypeScript 編譯器,無法避免執行時的錯誤,反而濫用型別斷言可能會導致執行時錯誤:
使用any臨時斷言
window.abc = 123 //這樣寫會報錯因為window沒有abc這個東西 // 改造如下 (window as any).abc = 123 //可以使用any臨時斷言在 any 型別的變數上,訪問任何屬性都是允許的。
as const
是對字面值的斷言,與const直接定義常量是有區別的
如果是普通型別跟直接const 宣告是一樣的
const names = 'momo' names = 'aa' //無法修改 這裡會報錯是因為const宣告瞭只讀 let names2 = 'momo' as const names2 = 'aa' //無法修改 這個報錯是因為型別斷言成了只讀,兩者方式並不一樣
下面換一種方式介紹一下
// 這裡宣告一個陣列陣列,並告訴編譯器是作為const只讀的 這個時候新增和刪除就會提示報錯 let a1 = [10, 20] as const; // 但是原生宣告的const 是不會報錯的 const a2 = [10, 20]; a1.unshift(30); // 錯誤,此時已經斷言字面量為[10, 20],資料無法做任何修改 a2.unshift(30); // 透過,沒有修改指標
型別斷言是不具影響力的
在下面的例子中,將 something 斷言為 boolean 雖然可以透過編譯,但是並沒有什麼用 並不會影響結果, 因為編譯過程中會刪除型別斷言
function toBoolean(something: any): boolean { return something as boolean; } toBoolean(1); // 返回值為 1 //
下一節學習typeScript 內建物件