接口可以描述函数类型;为了使用接口表示函数类型,我们需要给接口定义一个调用签名。它就像是一个只有参数列表和返回值类型的函数定义。参数列表里面的每个参数都需要名称和类型。
函数形参必须声明数据类型 返回值可以不声明数据类型(根据函数体中的逻辑导出的)
一、为函数定义类型
// 可以不写返回值的类型,但是必须写参数的类型
function fn(n1:number,n2:any[],n3:string){
return n1+n3
}
let a2=fn(100,[10,20],"30")
//加上返回值类型
function fn2(n1:number,n2:any[],n3:string):string{
return n1+n2.length+n3
}
let a=fn2(100,[10,20],"30")//必须填写设定的类型,a的返回值就是一个string类型的
我们可以给每个参数添加类型之后再为函数本身添加返回值类型。 TypeScript能够根据返回语句自动推断出返回值类型,因此我们通常省略它
//声明式和定义式
// 定义式:
let obj={fn:function(){}};
let c=function(){};
let arr=[function(){},10,"hello"];
(function(n:number){})(100);
// 声明式:
function fm(n:number,n2:string){
return n+n2.length
}
//区别:
// 定义式:是在作用域内部被引用的function
// 声明式:在作用域中声明function
二、可选参数和默认参数
// 可选参数
// 必选参数写在可选参数前面
function fm1(n:number,n2:string,n3?:string):any[]{
return [n2+n*100+n3?.length]
}
fm1(10,"111","23")
// 可选默认
function fm2(n:number,n2:string,n3:string="1111"):any[]{ //n3为可选默认
return [n2+n*100+n3?.length]
}
当然,还可以给参数设置默认值,在所有必选参数后面带默认值的参数都是可选的,与可选参数一样,在调用函数的时候可以省略。
ps:带默认值的参数不需要放在必选参数的后面。 如果带默认值的参数出现在必须参数前面,用户必须明确的传入 undefined值从而来获得默认值
三、剩余参数
// 剩余参数(...)===>必选参数
function f2(n:number,n2:string,...res:any[]){
}
f2(100,"hello",20,[30,10])
//可以规定剩余参数的类型
function f(n:number,n2:string,...res:[number,string]){
}
f(100,"hello",20,"111")