TS的函数和AS3.0里面的函数写法有一些相似之处,比如传统的写法:
1
2
3
4
5
6
7
8
9
10
|
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函数 ):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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函数 )
1
2
3
4
5
6
7
8
9
10
11
12
|
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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
做一个测试如下 :
我们编译一下(报类型不匹配):
可选参数 -> 可穿参数也可不传参数
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//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}` ); |
结果:
剩余参数(多变参数)
1
2
3
4
5
6
7
8
9
10
|
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}` ); |
结果:
回调函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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(); |
结果:
回调还可以用下面的方案:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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();
|
本文转自Aonaufly51CTO博客,原文链接:http://blog.51cto.com/aonaufly/1955204 ,如需转载请自行联系原作者