###原始資料型別
ts和js一樣,型別分為兩種:原始資料型別和物件型別 原始資料型別包括:布林值,數字,字串,null,undefined 以及es6中的Symbol
基本型別的定義和宣告
1.布林值
let isDone:boolean = false;
複製程式碼
注意:使用建構函式Boolean創造的物件不是布林值
let createdNewBoolean:boolean = new Boolean(1);
//編譯錯誤
//new Boolean()返回的是一個Boolean物件
let let createdNewBoolean:Boolean = new Boolean(1);
複製程式碼
let num:number = 123;
let str:string = 'I love China';
let bool:boolean = false;
複製程式碼
2.數值
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;
// ES6 中的二進位制表示法
let binaryLiteral: number = 0b1010;
// ES6 中的八進位制表示法
let octalLiteral: number = 0o744;
let notANumber: number = NaN;
let infinityNumber: number = Infinity;
//編譯後的結果
var decLiteral = 6;
var hexLiteral = 0xf00d;
// ES6 中的二進位制表示法
var binaryLiteral = 10;
// ES6 中的八進位制表示法
var octalLiteral = 484;
var notANumber = NaN;
var infinityNumber = Infinity;
複製程式碼
3.空值:JavaScript 沒有空值(Void)的概念,在 TypeScript 中,可以用 void 表示沒有任何返回值的函式:
function alertName(): void {
alert('My name is Tom');
}
//宣告一個 void 型別的變數沒有什麼用,因為你只能將它賦值為 undefined 和 null
let unusable: void = undefined;
void 型別的變數不能賦值給 number 型別的變數:
let u: void;
let num: number = u;
//// Type 'void' is not assignable to type 'number'.
複製程式碼
4.Null 和 Undefined:在 TypeScript 中,可以使用 null 和 undefined 來定義這兩個原始資料型別
// 這樣不會報錯
let num: number = undefined;
// 與 void 的區別是,undefined 和 null 是所有型別的子型別。也就是說 undefined 型別的變數,可以賦值給 number 型別的變數:
// 這樣也不會報錯
let u: undefined;
let num: number = u;
複製程式碼
5.任意型別 any任意值(Any)用來表示允許賦值為任意型別。 什麼是任意值型別
//如果是一個普通型別,在賦值過程中改變型別是不被允許的
let myFavoriteNumber: string = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
//但如果是 any 型別,則允許被賦值為任意型別。
let myFavoriteNumber: any = 'seven';
myFavoriteNumber = 7;
未宣告型別的變數
變數如果在宣告的時候,未指定其型別,那麼它會被識別為任意值型別
let something;
something = 'seven';
something = 7;
等價於
let something: any;
something = 'seven';
something = 7;
something.setName('Tom');
複製程式碼
####定義陣列的方式
//第一種方式
let numArr:number[] = [1,2,3,4,5];
let strArr:string[] = ['1','2','3'];
//第二種方式
let arr:Array<number> = [1,2,3,4,5];
let arr1:Array<string> = ['1','2','4'];
複製程式碼
####元組:表示數量和型別已知的陣列,也是陣列,不過陣列的長度,和陣列元素的型別是已知的
let pengStr:[string,number] = ['23',23]
複製程式碼
注意:在給元組賦值的時候,長度要保持和宣告的長度保持一致,型別要一一對應,不能顛倒
####陣列和元組的區別
元組
1.每一項都可以是不同的型別
2.有預定義的長度
3.用於表示一個固定的結構
複製程式碼
陣列
1.每一項都是同一種型別,除了any型別的陣列
2.沒有長度限制
3.用於表示一個列表
複製程式碼
####列舉
1.普通列舉
1.實現考慮一個變數的所有可能的值,儘量用自然語言中的單詞表示它的每一個值,比如性別,月份,星期,顏色,學歷,單位等
複製程式碼
enum Gender{
GIRL,
BOY
}
let g1:Gender = Gender.GIRL
let g2:Gender = Gender.BOY
console.log(Gender); //{ '0': 'GIRL', '1': 'BOY', GIRL: 0, BOY: 1 }
console.log(g1,g2); //0 1;
enum Week{
MONDAY = 1,
TUESDAY = 2
}
console.log(Week); //{ '1': 'MONDAY', '2': 'TUESDAY', MONDAY: 1, TUESDAY: 2 }
複製程式碼
注意:預設情況下,列舉型別索引是從0開始的,依次往後推,如果給的值是數字,按順序賦值,不然亂序
2.常數列舉 常數列舉和普通列舉的區別是,它是在編譯階段被刪除,並且不包含計算成員,假如包含了計算成員,則會在編譯階段報錯
const enum Colors {
Red = 'a',
Yellow = 'b',
Green = 'c'
}
//console.log(Colors); //報錯 不能直接列印這個常量列舉,因為在編譯階段會被刪除,只能通過屬性來呼叫,不能直接呼叫
console.log(Colors.Red,Colors.Yellow,Colors.Green); //只能這樣寫
console.log(Colors[0]); // 也不可以這樣寫
複製程式碼
####never型別 永遠不知道什麼型別
使用場景
1. 如果一個函式永遠不會返回或者陷入死迴圈,那麼他的返回值型別就是never
typescript function sum():never{ while(true){ } }
2.如果一個函式一定要丟擲一個錯誤,那它永遠不會正常結束,它的返回型別也是一個never
typescript function nums():never{ throw Error('我錯了') }
#### void 和 never的區別
1.void可以被賦值為null和undefined,never則是一個不包含值的型別
2.擁有void返回值型別的函式能正常執行,擁有never型別的返回值型別的函式無法正常返回,無法終止或丟擲異常
#### 斷言 就是強行告訴ts是一個什麼型別,型別斷言可以將一個聯合型別的變數,指定一個更加具體的型別
```typescript
let names:number|string|null;
console.log((names as string).length);
console.log((names as number).toFixed(2));
```
####字面量型別 可以把字串,數字,布林值字面量組成一個聯合型別
```typescript
type zType = 1|'one'|true;
let t1:zType = 1;
let t2:zType = 'one';
let t3:zType = true;
```
#### 字串字面量 vs 聯合型別
1.字串字面量型別用來約束取值只能是某幾個個字串中的一個,聯合型別表示取值可以為多種型別中的一種
2.字串字面量限定了使用該字面量的地方僅接受特定的值,聯合型別對於值並沒有限定,僅僅限定值型別需要保持一致
複製程式碼