TypeScript 數據類型
Boolean 類型
let isDone: boolean = false; // tsc => var isDone = false;
Number 類型
let count: number = 10; // tsc => var count = 10
String 類型
let name: string = 'Semliker'; // tsc => var name = 'Semlinker'
Array 類型
let list: number[] = [1,2,3]; // tsc => var list = [1,2,3]; let list: Array<number> = [1,2,3]; // tsc => var list = [1,2,3];
Enum 類型
enum Direction {
NORTH,
SOUTH,
EAST,
WEST
};
let dir: Direction = Direction.NORTH;
Any (動態類型)
空值
JavaScript 沒有空值(Void)的概念,在 TypeScirpt 中,可以用 void
表示沒有任何返回值的函數:
function alertName(): void { alert('My name is Tom'); }
聲明一個 void
類型的變量沒有什么用,因為你只能將它賦值為 undefined
和 null
:
let unusable: void = undefined;
Null 和 Undefined
在 TypeScript 中,可以使用 null
和 undefined
來定義這兩個原始數據類型:
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'.
類型推論
以下代碼雖然沒有指定類型,但是會在編譯的時候報錯:
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'.
TypeScript 會在沒有明確的指定類型的時候推測出一個類型,這就是類型推論。
如果定義的時候沒有賦值,不管之后有沒有賦值,都會被推斷成 any
類型而完全不被類型檢查:
let myFavoriteNumber; myFavoriteNumber = 'seven'; myFavoriteNumber = 7;
聯合類型
聯合類型(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'.
聯合類型使用 |
分隔每個類型。
這里的 let myFavoriteNumber: string | number
的含義是,允許 myFavoriteNumber
的類型是 string
或者 number
,但是不能是其他類型。
當 TypeScript 不確定一個聯合類型的變量到底是哪個類型的時候,我們只能訪問此聯合類型的所有類型里共有的屬性或方法:
function getLength(something: string | number): number { return something.length; } // index.ts(2,22): 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
屬性時就報錯了。
參考: