✍️ TS学习笔记-函数(一)

73 阅读2分钟

函数是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编译器也是会自动识别出类型的
这叫做按上下文归类,是类型推论的一种。

image.png

调用签名

在定义函数类型时,无法为函数定义自身的属性,若有此需求,可以使用调用签名进行配置
需要注意,在调用签名中,类型定义的语法结构有所改动

    // 调用签名
    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)