TypeScript 學習筆記 (二)—— 類型

  1. 原始數據類型

    // 定義布爾值
    let isDone: boolean = false;
    // 16進制
    let hexLiteral:number =0xf00d
    // 二進制
    let binaryLiteral : number =0b1010
    // 八進制
    let octalLiteral:number = 0o744
    let notNumber :number = NaN
    let infinityNumber:number = Infinity
    let undefined1:undefined=undefined
    let null1 : null=null
    // 定義字符串
    let str:string ='121aaa'
    // 定義空值
    function kongzhi():void { // 沒有返回值的函數
        console.log('空置')
    }
    let kongzhi1:void=undefined
    // 編寫報錯 Type 'null' is not assignable to type 'void'
    let kongzhi2:void=null
    
  2. 聯合類型

    let aStrOrNum: string | number;
    aStrOrNum = 'seven';
    aStrOrNum = 7;
    
  3. 任意類型

    let anyThing:any = 'Tom';
    // 報錯 Uncaught TypeError: anyThing.setName is not a function
    // 編譯成js後報錯
    anyThing.setName('Jerry');
    // 報錯 Uncaught TypeError: anyThing.sayHello is not a function
    // 編譯成js後報錯
    anyThing.sayHello();
    
  4. 對象類型(接口)
    賦值的時候,變量的形狀必須和接口的形狀保持一致,不允許添加未定義的屬性
    一旦定義了任意屬性,那麼確定屬性和可選屬性的類型都必須是它的類型的子集
    只讀的約束存在於第一次給對象賦值的時候,而不是第一次給只讀屬性賦值的時候

    interface Person{
        // 只讀屬性,不可改變
        readonly id:number,
        name:string,
        age:number,
        // 可有可無的屬性
        // nihao?:string,
        // 定義可有可無的屬性 和 定義任何屬性不能同時存在,編寫時會報錯,編譯爲js文件後能用
        // 定義任何鍵,定義字符串或者數字爲值
        [propName:string]:string|number
    }
    let tom:Person={
       id:114141,
        name:'你好',
        age:45,
        nihao:'dada',
        d:4
    }
    // 報錯 編寫時會報錯,編譯爲js文件後能用
    tom.id=123131
    
  5. 數組類型

    let numArr:number[]=[1,2,3,4]
    // 編寫時報錯 Argument of type '"3"' is not assignable to parameter of type 'number'
    numArr.push('3')
    // 數組泛型定義數組
    let numArr1: Array<string>=['1','2']
    // 接口定義數組
    interface numberArray{
        [index:number]:number
    }
    let numArr2:numberArray=[1,2]
    // 類數組不是數組,例如arguments,只能用接口定義
    // 編寫時報錯 
    // Type 'IArguments' is missing the following properties from type 'number[]': pop, push, concat, join, and 15 more
    function test(){
        let args:number[]=arguments
    }
    // 接口定義方式一
    interface fnArgs {
        [index:number]:any,
        length:number,
        callee:Function
    }
    function test(){
        let args:fnArgs=arguments
    }
    // 接口定義方式二
    function test2(){
        let args:{
            [index:number]:number,
            length:number,
            callee:Function
        }=arguments
    }
    
  6. 函數類型

    //  函數聲明
    function sum(x:number,y:number):number{
        return x+y
    }
    // 注意,輸入多餘的(或者少於要求的)參數,是不被允許的:
    // 編寫錯誤 
    // Expected 2 arguments, but got 1
    sum(1)
    // 編寫錯誤
    // Expected 2 arguments, but got 3
    sum(1,2,3)
    // 函數表達式
    let sum1:(x:number,y:number) => number = (x:number,y:number):number =>{
        return x+y
    }
    // 接口定義函數
    // 採用函數表達式 | 接口定義函數的方式時,對等號左側進行類型限制,可以保證以後對函數名賦值時保證參數個數、參數類型、返回值類型不變。
    interface sum2Interface{
        (x:number,y:number):number
    }
    
    let sum2:sum2Interface; 
    sum2 =  (x:number,y:number)=>{
        return x+y
    }
    // 可選參數,可選參數後面不允許再出現必需參數了
    function stringContact(x:string,y?:number):number{
        return x+y
    }
    // 默認值
    function sum4(x:number=0,y:number=1):number{
        return x+y*10
    }
    sum4() // 10
    // 剩餘參數,ES6 中,可以使用 ...rest 的方式獲取函數中的剩餘參數(rest 參數)
    // rest 參數只能是最後一個參數,關於 rest 參數,可以參考 ES6 中的 rest 參數
    function push(array, ...items) {
        items.forEach(function(item) {
            array.push(item);
        });
    }
    let a: any[] = [];
    push(a, 1, 2, 3);
    // 函數重載
    function reverse(v:number):number;
    function reverse(v:string):string;
    function reverse(v:string|number):string|number{
        if(typeof v === 'number'){
            return Number(v.toString().split('').reverse().join(''))
        }else if(typeof v==='string'){
            return v.split('').reverse().join("")
        }
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章