TypeScript-----資料型別

Alex_Peng發表於2020-01-02

###原始資料型別

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.字串字面量限定了使用該字面量的地方僅接受特定的值,聯合型別對於值並沒有限定,僅僅限定值型別需要保持一致
複製程式碼

相關文章