TS 的型別宣告和變數型別
阿新 • • 發佈:2022-03-17
一、型別宣告
型別宣告是 TS 非常重要的一個特點,通過型別宣告可以指定 ts 中變數(引數、形參)的型別
當為變數賦值時,TS編譯器會自動檢查值是否符合型別宣告,符合則賦值,否則報錯
簡而言之,型別宣告給變數設定了型別,使得變數只能出儲存某種型別的值,這是 JS 不具備的
語法:
- 直接在變數聲明後面加
let a: number; a = 7; a = 'luck';//此行程式碼會報錯
- 如果變數的宣告和賦值是同時進行的,TS 可以自動對變數進行型別檢測
let a = true; a = false;
- 可以對函式引數和返回值的型別進行宣告
function sum(a: number, b: number): number{return a + b; }
二、變數型別
1、字面量
let a1: 10;
a1 = 10;
//後面使用時不可修改,類似常量 //可以使用 | 來連線多個型別(聯合型別),表示‘或’ let b1: "male" | "female"; b1= "male"; b1= "female"; let c1 : boolean | string; c1 = true; c1 = 'hello';
2、any —— 任意型別
一個變數設定型別為any後相當於對該變數關閉了TS的型別檢測
// let d:any;(顯示的any) //宣告變數如果不指定型別,則TS解析器會自動判斷變數的型別為any(隱式的any)let d; d = 10; d = 'hello'; d = 'true';
3、unknown —— 未知型別
實際上就是一個型別安全的any
let e: unknown; e = 10; e = true; e = "hello";
any型別的變數可以賦值給任意變數;但unknown 型別的變數不能直接賦值給其他變數
let s:string; //d的型別是any,它可以賦值給任意變數 let d; s = d; let e: unknown; e = 'hello'; s = e;//會報錯,e的型別是unknown,不能直接賦值給其他變數 if (typeof e === "string") { s= e; }
型別斷言 —— 可以用來告訴解析器變數的實際型別
/* 語法: 變數 as 型別 <型別>變數 */ s = e as string; s = <string>e;
4、void —— 表示空值
以函式為例,就表示沒有返回值(或返回undefined)的函式
function fn2(): void{ }
5、never
表示永遠不會返回結果;沒有值(比較少用,一般是用來丟擲錯誤)
function fn3(): never{ throw new Error("報錯了!"); }
6、object
用來指定物件中可以包含哪些屬性
/* 語法:{屬性名:屬性值,屬性名:屬性值} 在屬性名後面加上?,表示屬性是可選的 */ let b: {name: string, age?:number}; b = {}; //沒有的話就會報錯 b = {name: "孫悟空", age: 18}; let c1: {name: string, a?:number, b?:number}; c1 = {name:"豬八戒", a:1, b:2,c:3} //會報錯,多餘了c
//[propName: string]: any 表示可以多餘任意型別的屬性 let c: {name: string, [propName: string]: any} c = {name:"豬八戒", age: 18, gender: '男'}
7、array
/* 陣列的型別宣告: 型別[] Array<型別> */ //string[] 表示字串陣列 let e1:string[]; e1 = ['a','b','c']; //number[] 表示數值陣列 let f: number[]; let g: Array<number>; g = [1, 2, 3];
8、tuple(ts新增型別)
就是固定長度的陣列
/* 語法:[型別, 型別, 型別] */ let h: [string, number]; h = ['hello', 123];
9、enum(ts新增型別)
列舉可以把所有可能的值都列舉出來
enum Gender{ //定義列舉型別可以把所有可能的值都列舉出來 Male = 0, Female = 1, } let i: {name: string, gender: Gender}; i = { name: '孫悟空', gender: Gender.Male } console.log(i.gender === Gender.Male)