介紹
在TypeScript中,提供了以下基本資料型別:
- 布林型別
- 數字型別
- 字串型別
- 陣列型別
- 元組型別
- 列舉型別
- 任意值型別
- null和undefined
- void型別
- never型別
其中元組、列舉、任意值、void型別和never型別是TypeScript有別於JavaScript的特有型別。
布林型別
布林型別是最簡單的資料型別,只有true和false兩種值。下面定義了一個布林類值的變數flag,並賦值為true。由於flag被初始化為布林型別,如果再賦值為非boolean的其他型別值,編譯時會丟擲錯誤。
let flag:boolean = true;
flag = 1; //報錯,不能把數字型別的值賦給布林型別的變數。
數字型別
在TypeScript中,數字都是浮點型。TypeScript同時支援二進位制、八進位制、十進位制和十六進位制字面量,示例程式碼如下:
let binaryLiteral:number = 0b1010;//二進位制
let octalLiteral:number = 0o744;//八進位制
let decLiteral:number = 6;十進位制
let hexLiteral:number = 0xf00d;//十六進位制
字串型別
TypeScript支援使用單引號(‘)或者雙引號(“)來表示字串型別。除此之外,還支援使用模版字串反引號(`)來定義多行文字和內嵌表示式。使用${expr}的形式嵌入變數或者表示式,在處理拼接字串的時候很有用,示例程式碼如下。
let name: string = "Angular";
let years:number = 5;
let words:stirng = `你好,今年是${name}釋出${years+1}週年`;
陣列型別
TypeScript像JavaScript一樣可以運算元組元素。 有兩種方式可以定義陣列。
第一種,可以在元素型別後面接上 [],表示由此型別元素組成的一個陣列:
let list: number[] = [1, 2, 3];
第二種方式是使用陣列泛型,Array<元素型別>:
let list: Array<number> = [1, 2, 3];
元組型別
元組型別用來表示已知元素數量和型別的陣列,各元素的型別不必相同,下面定義了一對值分別為字串和數字型別的元組。
let x:[string,number];
x = ["Angular",24];
x = [10,"Angular"];//報錯
console.log(x[0]); //輸出Angular
列舉型別
列舉是一個可被命名的整型常數的集合,列舉型別為集合成員賦予有意義的名稱,增強可讀性。
enum Color {Red, Green, Blue}
let c: Color = Color.Blue;
console.log(c);//輸出:2
列舉預設下標是0,可以手動修改預設下標值
enum Color {Red=2, Blue, Green=6}
let c: Color = Color.Blue;
console.log(c);//輸出:3
任意值型別
任意值是TypeScript針對程式設計時型別不明確的變數使用的一種資料型別,它常用於以下二種情況。
① 變數的值動態變化時,比如來自使用者的輸入或者第三方程式碼庫,任意值型別可以讓這些變數跳過編譯階段的型別檢查
let x:any = 1;//數字型別
x = "I am a string"; //字串型別
x = false; //布林型別
② 定義儲存各種型別資料的陣列時
let arrayList:any[] = [1,falses,"fine"];
arrayList[1] = 100;
Void
function warnUser(): void {
alert("This is my warning message");
}
宣告一個void型別的變數沒有什麼大用,因為你只能為它賦予undefined和null:
let unusable: void = undefined;
let unusable: void = null;
Null 和 Undefined
TypeScript裡,undefined和null兩者各自有自己的型別分別叫做undefined和null。 和 void相似,它們的本身的型別用處不是很大:
let u: undefined = undefined;
let n: null = null;
undefined 型別的變數只能被賦值為 undefined,null 型別的變數只能被賦值為 null。
與 void 的區別是,undefined 和 null 是所有型別的子型別。也就是說 undefined 型別的變數,可以賦值給 number 型別的變數,但是儘量不要這麼用。
// 這樣不會報錯
let num: number = undefined;
// 這樣也不會報錯
let u: undefined;
let num: number = u;
而 void 型別的變數不能賦值給 number 型別的變數:
let u: void;
let num: number = u;
// index.ts(2,5): error TS2322: Type `void` is not assignable to type `number`.
型別推論
如果沒有明確的指定型別,那麼 TypeScript 會依照型別推論(Type Inference)的規則推斷出一個型別。
以下程式碼雖然沒有指定型別,但是會在編譯的時候報錯:
let myFavoriteNumber = `seven`;
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type `number` is not assignable to type `string`.
事實上,它等價於:
let myFavoriteNumber: string = `seven`;
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type `number` is not assignable to type `string`.
聯合型別
聯合型別(Union Types)表示取值可以為多種型別中的一種。
let myFavoriteNumber: string | number;
myFavoriteNumber = `seven`;
myFavoriteNumber = 7;
let myFavoriteNumber: string | number;
myFavoriteNumber = true;
// index.ts(2,1): error TS2322: Type `boolean` is not assignable to type `string | number`.
// Type `boolean` is not assignable to type `number`.
聯合型別使用 | 分隔每個型別。
這裡的 string | number 的含義是,允許 myFavoriteNumber 的型別是 string 或者 number,但是不能是其他型別。
聯合型別的屬性或方法
當 TypeScript 不確定一個聯合型別的變數到底是哪個型別的時候,我們只能訪問此聯合型別的所有型別裡共有的屬性或方法:
function getLength(something: string | number): number {
return something.length;
}
// index.ts(2,20): error TS2339: Property `length` does not exist on type `string | number`.
// Property `length` does not exist on type `number`.
上例中,length 不是 string 和 number 的共有屬性,所以會報錯。
訪問 string 和 number 的共有屬性是沒問題的:
function getString(something: string | number): string {
return something.toString();
}
聯合型別的變數在被賦值的時候,會根據型別推論的規則推斷出一個型別:
let myFavoriteNumber: string | number;
myFavoriteNumber = `seven`;
console.log(myFavoriteNumber.length); // 5
myFavoriteNumber = 7;
console.log(myFavoriteNumber.length); // 編譯時報錯
// index.ts(5,30): error TS2339: Property `length` does not exist on type `number`.
上例中,第二行的 myFavoriteNumber 被推斷成了 string,訪問它的 length 屬性不會報錯。
而第四行的 myFavoriteNumber 被推斷成了 number,訪問它的 length 屬性時就報錯了。