1. 程式人生 > >TypeScript 函數

TypeScript 函數

函數 function typescript

TS的函數和AS3.0裏面的函數寫法有一些相似之處,比如傳統的寫法:

function add( a : number , b : number ):number{
    return a + b;
}
//也可以這樣寫
let  myAdd : Function = function( a : number , b : number ) : number{
    return a + b;
};

let sum : number = add(2,2);
console.log( `2+2 = ${sum}` );

我是用Node命令得到結果如下:

技術分享

好 , 補充一句 : TS的作者其實是C#的作者 , 所以TS中函數的變形寫法很像lambda


下面使用此方案 , 實現類似的函數( add_change_01函數 ):

function add( a : number , b : number ):number{
    return a + b;
}
//也可以這樣寫
let  myAdd : Function = function( a : number , b : number ) : number{
    return a + b;
};


//類似Lamdba表達式 ( x : number , y : number )為參數列表 對應 ( a : number , b : number)
//=> number 表示返回值
let add_change_01 :( x : number , y : number ) => number = function( a : number , b : number) : number{ return a + b; };

let sum : number = add_change_01(2,3);
console.log( `2+3 = ${sum}` );

可以查看生成的Js代碼基本是一樣的( add_change_01函數 )

function add(a, b) {
    return a + b;
}
//д
var myAdd = function (a, b) {
    return a + b;
};
//Lamdba ( x : number , y : number )б  ( a : number , b : number)
//=> number 
var add_change_01 = function (a, b) { return a + b; };
var sum = add_change_01(2, 3);
console.log("2+3 = " + sum);

解釋:

//類似Lamdba表達式 ( x : number , y : number )為參數列表 對應 ( a : number , b : number)

//=> number 表示返回值


再次簡化這種函數的編寫方式如下:(add_change_02)

function add( a : number , b : number ):number{
    return a + b;
}
//也可以這樣寫
let  myAdd : Function = function( a : number , b : number ) : number{
    return a + b;
};


//類似Lamdba表達式 ( x : number , y : number )為參數列表 對應 ( a : number , b : number)
//=> number 表示返回值
let add_change_01 :( x : number , y : number ) => number = function( a : number , b : number) : number{ return a + b; };

//因為知道參數列表的對應關系 所以 a 和 b 可以不寫類型
//因為知道返回類型所以( a , b)後面沒有必要加:number
let add_change_02 :( x : number , y : number ) => number = function( a , b){ return a + b };

let sum : number = add_change_02(2,3);
console.log( `2+3 = ${sum}` );

編譯下一 , 得到的Js是一樣的(add_change_02)

技術分享

解釋:

//因為知道參數列表的對象關系 所以 a 和 b 可以不寫類型

//因為知道返回類型所以( a , b)後面沒有必要加:number

做一個測試如下 :

技術分享

我們編譯一下(報類型不匹配):

技術分享




可選參數 -> 可穿參數也可不傳參數

//b? : 在參數b的後面加一個問號表示可選參數
let myAdd_change : Function = function( a : number , b? : number) : number{
    if( b ){
        return a + b;
    }else{
        return a;
    }
}
let sum : number = myAdd_change(2,3);//傳了第二個參數
console.log( `2+3 = ${sum}` );

let num : number = myAdd_change( 2 );//沒有穿第二個參數
console.log( `2 = ${num}` );

結果:

技術分享



剩余參數(多變參數)

let myAdd_change_02 : Function = function( a : number , ... oters : number[] ) : number{
    if( oters && oters.length > 0 ){
        for( let i : number = 0 , j : number = oters.length ; i < j ; i ++){
            a += oters[i];
        }
    }
    return a;
}
let num : number = myAdd_change_02( 2 , 3 , 4 );
console.log( `2 + 3 + 4 = ${num}` );

結果:

技術分享




回調函數

class Listener{
    public  info : string;
    public onExe : Function = (type:string) => {
        this.info = type
        console.log( `exe callback ${this.info}` );
    };
}

class Dispose{
    public _listen : Listener = null;
    private _callBack : Function = null;
    constructor(){
        this._listen = new Listener();
        this._callBack = this._listen.onExe;//註入回調函數
    }
    public testCallBack : Function = ()=>{
        if( this._callBack != null ){
            this._callBack( "good callback!" );//回調成功
        }else{
            console.log("unregister callback");//回調失敗
        }
    };
}

let dispose : Dispose = new Dispose();
dispose.testCallBack();

結果:

技術分享


回調還可以用下面的方案:

class Listener{
    public  info : string;
    public onExe : Function = (type:string) => {
        this.info = type;
        console.log( `exe callback ${this.info}` );
    };
    
    //可以使用此方法
    public onExe_Change:(type:string)=>void=function(a){
        this.info = a;
        console.log(`exe callback ${this.info}`);
    };
}

class Dispose{
    public _listen : Listener = null;
    private _callBack : Function = null;
    constructor(){
        this._listen = new Listener();
        //this._callBack = this._listen.onExe;//註入回調函數
        this._callBack = this._listen.onExe_Change;//註入回調函數
    }
    public testCallBack : Function = ()=>{
        if( this._callBack != null ){
            this._callBack( "good callback!" );//回調成功
        }else{
            console.log("unregister callback");//回調失敗
        }
    };
}

let dispose : Dispose = new Dispose();
dispose.testCallBack();


本文出自 “Better_Power_Wisdom” 博客,請務必保留此出處http://aonaufly.blog.51cto.com/3554853/1955204

TypeScript 函數