ES6的數據類型
- Boolean
- Number
- String
- Array
- Function
- Object
- Symbol
- undefined
- null
TypeScript新加的數據類型
- void
- any
- never
- 元組
- 枚舉
- 高級類型
1,數組
//數組 兩種等價聲明 let arr1:number[] = [1,2,3] let arr2:Array<number> = [1,2,3]
2,元組
//元組 //是一種特殊的數組,限定了數組的類型和個數 let tuple: [number,string]=[0,'1'] //為元組添加一個新的元素會怎樣?允許添加 tuple.push(2) console.log(tuple) tuple[2] // 但是不能訪問 //tuple type '[number, string]' of length '2' has no element at index '2'.
所以非常不推薦通過push往元組里加元素。
3,函數類型
//通常返回值的類型是可以省略的,可以看到返回值的類型仍然是number let add=(x:number,y:number)=>x+y //定義一種函數類型compute,沒有具體實現 let compute:(x:number, y:number) =>number compute=(a,b)=>a+b
4,對象類型
//對象 let obj:object = {x:1, y:2} //obj.x=3; //不能賦值,因為object類型 let obj2:{x:number,y:number} = {x:1, y:2} obj2.x=3 //可以
5,Symbol類型
Symbol的含義是具有唯一的值。
//symbol let s1: symbol=Symbol() let s2=Symbol() console.log(s1==s2) //false
6,不能把其他類型賦值給undefined和null
//undefined ,null let un :undefined = undefined let nu: null = null // un = 1 //聲明了undefined,就不能賦值為其他任何類型 let num2: number = 123 num2 = undefined //不能將類型“undefined”分配給類型“number”。 num2=null //不能將類型“null”分配給類型“number”。
TS中undefined和null是任何類型的子類型。
可以通過改配置把"strictNullChecks": false, 設置為false。
允許把undefined和null賦值給其他類型的值。
7,void
JS中void是一種運算符,可以讓任何表達式返回undefined.
void
運算符 對給定的表達式進行求值,然后返回 undefined
。
void運算符通常只用於獲取undefined的原始值,一般使用void(0),等同於void 0。
8,never類型
永遠不會有返回值的類型
//never let error=()=>{ throw new Error('error') } let endless=()=>{ while(true){} }
9,枚舉類型
enum Role{ Reporter =1, Developer, Maintainer, Owner, Guest }
實現原理:反向映射
"use strict"; var Role; (function (Role) { Role[Role["Reporter"] = 1] = "Reporter"; Role[Role["Developer"] = 2] = "Developer"; Role[Role["Maintainer"] = 3] = "Maintainer"; Role[Role["Owner"] = 4] = "Owner"; Role[Role["Guest"] = 5] = "Guest"; })(Role || (Role = {}));
枚舉分類:
常量枚舉(編譯時計算出結果,在運行時以產量出現)
Computed枚舉:非常量表達式
enum Char{ //const 編譯時算出結果 a, b = Char.a, c=1+3, //computed 運行時才會計算 d=Math.random(), e='123'.length }
可以看到得到的js
"use strict"; var Char; (function (Char) { //const 編譯時算出結果 Char[Char["a"] = 0] = "a"; Char[Char["b"] = 0] = "b"; Char[Char["c"] = 4] = "c"; //computed 運行時才會計算 Char[Char["d"] = Math.random()] = "d"; Char[Char["e"] = '123'.length] = "e"; })(Char || (Char = {}));
常亮枚舉(用const聲明的枚舉)會在編譯階段被移除。不需要對象,只需要對象的值的時候用常量枚舉,可以減少編譯后的代碼。
const enum Month{
Jan,
Feb,
Mar
}
let month =[Month.Jan, Month.Feb, Month.Mar]
編譯后的js
"use strict"; let month = [0 /* Jan */, 1 /* Feb */, 2 /* Mar */];