函数是JavaScript应用程序的基础。 它可以实现抽象层,模拟类,和模块.
在TypeScript里,虽然已经支持类,命名空间和模块,但函数仍然是定义行为的主要地方
声明函数
步骤一:定义参数类型
步骤二:定义函数返回值类型,( TypeScript能够根据返回语句自动推断出返回值类型 )
//1.具名函数
function calc1(num1:number, num2:number):number{
return num1 + num2
}
//2.匿名函数
let calc2 = function(num1:number, num2:number):number{
return num1 + num2
}
//3.箭头函数
let calc3 = (num1:number, num2:number):number=>{
return num1 + num2
}
定义函数类型
函数类型包含两部分:参数类型和返回值类型,两者是必要的。
语法结构: (a: string) => void
表示有一个名为 a
,类型是字符串的参数,且该函数没有返回任何值。
如果函数没有返回任何值,也必须指定返回值类型void
,不能留空。
//为每个参数指定名字和类型,这个名字(num1,num2)只是为了增加可性
type CalcFunction = (num1: number,num2:number) => number
let myCalc:CalcFunction = (test1:number,test2:number):number=>{
return test1 - test2;
}
类型推断
案例得证:赋值语句如果没有定义函数类型的话,TypeScript编译器也是会自动识别出类型的
这叫做按上下文归类
,是类型推论的一种。
调用签名
在定义函数类型时,无法为函数定义自身的属性,若有此需求,可以使用调用签名进行配置
需要注意,在调用签名中,类型定义的语法结构有所改动
// 调用签名
type CalcFunction = {
name:string,
(num1:number,num2:number):number //类型定义方式从=> 转变为:
}
function myCalc(test1:number,test2:number):number{
return test1 + test2;
}
myCalc.name = 'first_CalcFunction'
function testCallSign(fun:CalcFunction){
// 若不使用调用签名,采用默认方式去定义类型,在编译时 这里调用name会报错: Property 'name' does not exist on type 'CalcFunction'.
console.log(fun.name,fun(100,99)) // 'first_CalcFunction',199
}
testCallSign(myCalc)