一、擴展類型
擴展類型:類型別名、枚舉、接口、類。
枚舉:通常用于約束某個變量的取值范圍。?
字面量和聯合類型配合使用,也可以達到同樣的目標。
二、字面量類型的問題?
- 在類型約束位置,會產生重復代碼。可以使用類型別名解決該問題;
- 邏輯含義和真實的值產生了混淆,會導致當修改真實值的時候,產生大量的修改;
- 字面量類型,不會進入編譯結果。
三、枚舉
?1.如何定義一個枚舉
enum 枚舉名{
? ? ? ? 枚舉字段1 = 值1,
? ? ? ? 枚舉字段2 = 值2,
? ? ? ? ...
}
enum Sex { male = "男",female = "女"
}let sex: Sex
sex = Sex.maleconsole.log(sex); // 男
上面代碼中,將枚舉中的 male 改為 "帥哥" ,則輸出 "帥哥" 。
枚舉會出現在編譯結果中,編譯結果中表現為?對象?。
var Sex;
(function (Sex) {Sex["Male"] = "\u7537";Sex["Female"] = "\u5973";
})(Sex || (Sex = {}));
let sex;
sex = Sex.Male;
console.log(sex);
?2.枚舉的規則
- 枚舉的 字段值 可以使用?字符串?或者?數字 ;
- 數字枚舉的值會 自增 ,當第一個字段沒有賦值時,默認為 0 ;
- 被數字枚舉約束的變量,可以直接賦值為數字,可能會導致問題,不推薦;
- 數字枚舉的編譯結果 和 字符串的編譯結果有差異;
enum Level { level1 = 2,level2,level3,
}let l: Level = Level.level2console.log(l); // 3
enum Level { level1,level2,level3,
}let l: Level = Level.level1console.log(l); // 0
數字枚舉的編譯結果:
var Level;
(function (Level) {Level[(Level["level1"] = 0)] = "level1";Level[(Level["level2"] = 1)] = "level2";Level[(Level["level3"] = 2)] = "level3";
})(Level || (Level = {}));
/*
{level1: 0,level2: 1,level3: 2,0:"level1",1:"level2",2:"level3"
}
*/
let l = Level.level1;
console.log(l);
因此循環遍歷數字枚舉時需要考慮到這點。
3.最佳實踐?
- 盡量不要在一個枚舉中即出現字符串字段,又出現數字字段;
- 使用枚舉時,盡量使用枚舉字段的名稱,而不使用真實的值;
四、位枚舉(枚舉的位運算)
位枚舉針對數字枚舉。
位運算:兩個數字換算成二進制的運算。
// 位枚舉
enum Permission { Read = 1, // 2^0 0001Write = 2, // 2^1 0010Create = 4, // 2^2 0100Delete = 8 // 2^3 1000
}// 1.如何組合權限:使用或運算
let p: Permission = Permission.Read | Permission.Write// 2.如何判斷是否有權限:使用與運算
// let hasRead: boolean = (p & Permission.Read) === Permission.Read
function hasPermission(target: Permission, per: Permission) { return (target & per) === per
}
// 判斷變量p是否擁有可讀權限
console.log(hasPermission(p, Permission.Read)); // true// 3.如何刪除某個權限:使用異或運算
p = p ^ Permission.Write
console.log(hasPermission(p, Permission.Write)); // false