②TypeScript 函数(可选参数,默认参数,剩余参数,函数重载)


写下博客主要用来分享知识内容,并便于自我复习和总结。
如有错误之处,请各位大佬指出。


函数的定义

// 定义函数

    // es5定义函数的方法:
    // ①函数声明法
    function run(){
        return "run"
    }
    // ②匿名函数
    let run2 = function(){
        return "run2"
    }

    // ts中定义函数的方法:
    // ①函数声明法
    function run3():string{
        return "run3"
        // 错误写法:
        // return 123
    }
    // ②匿名函数
    let run4 = function():number{
        return 123
    }
    console.log(run4())

// ts中定义方法传参

    // ①函数声明法
    function getInfo(name:string, age:number):string{
        return `${name} --- ${age}`
    }
    console.log(getInfo("王路飞",17))

    // ②匿名函数
    let getInfo2 = function(name:string, age:number):string{
        return `${name} --- ${age}`
    }
    console.log(getInfo2("孙鹏飞",22))

// 没有返回值的方法

    // ①函数声明法
    function a():void{
        console.log("runA")
    }
    a()

    // ②匿名函数
    let b = function():void{
        console.log("runB")
    }
    b()

除此以外,在传参的时候,我们还可以传一个对象。如果我们想保证代码健壮性,我们只能这样加类型注解,否则报错:

function add({one, two}:{one:number, two:number}){
    return one + two;
}
const total = add({one: 1, two: 2})

方法可选参数

    // es5里面方法的实参和形参可以不一样,但是ts中必须一样。
    // 如果不一样,就需要配置可选参数。
    function getInfo(name:string,age?:number):string{
        if(age){
            return `${name} --- ${age}`
        }else{
            return `${name} --- 年龄保密`
        }
    }
    console.log(getInfo("王路飞"))
    console.log(getInfo("孙鹏飞",22))

这里需要注意一个问题:可选参数一定要配置到参数的最后面。如果反过来,如下例:

    function getInfo2(age?:number,name:string):string{
        if(age){
            return `${name} --- ${age}`
        }else{
            return `${name} --- 年龄保密`
        }
    }

我们可以看到ts会报错。
在这里插入图片描述
但其实在js中肯定是能编译通过的,因为它不涉及数据类型和参数问题:
在这里插入图片描述
但当然ts推荐我们让可选参数配置到参数的最后面。其实道理很简单,既然可选参数在前面,那么假设只传递一个参数,那么这个参数到底是给哪个参数,编译器无从得知。因为这也许是给后面的参数(正确思路),又或者是给可选参数的(错误写法,因为少传递了参数),而TS肯定不想让这种情况发生,因为它就是为了解决这些不严谨性,让我们在编写代码时发现一切错误。


默认参数

在es5里面没有办法设置默认参数,es6和ts中都可以设置默认参数。

在使用方法时,如果不传递参数就使用默认参数,如果传递参数就覆盖默认参数。

function getInfo(name:string,age:number=17):string{
    if(age){
        return `${name} --- ${age}`
    }else{
        return `${name} --- 年龄保密`
    }
}
console.log(getInfo("孙鹏飞"))
console.log(getInfo("王路飞",20))

剩余参数

简例:

function sum(a:number,b:number,c:number):number{
    return a+b+c
}
console.log(sum(1,2,3))

这样数据一多,显然很麻烦。

三点运算符:接收新参传过来的值

function sum(...result:number[]):number{
    let sum = 0
    for(let i = 0; i < result.length; i++){
        sum += result[i]
    }
    return sum
}
console.log(sum(1,2,3,4,5,6))

函数重载

Java中方法的重载,指的是两个或者两个以上同名函数,但它们的参数不一样,这时会出现函数重载的情况。而TypeScript中的重载,指的是通过为同一个函数提供多个函数类型定义来实现多种功能的目的,并且ts为了兼容es5以及es6重载的写法,导致它和java中的是有区别。

在es5里是这样的,如果出现同名函数,后面的函数就会覆盖上面的函数:

function getInfo(config){
    
}
function getInfo(config,value){
    
}

在ts里,它是这样的:

function getInfo(name:string):string;
function getInfo(age:number):number;
function getInfo(str:any):any{
    if(typeof str === "string"){
        return "我是:"+str
    }else{
        return "我的年龄:"+str
    }
}
console.log(getInfo("张三"))
console.log(getInfo(22))
// 错误写法,因为不存在这样的同名函数中,有这样的数据类型
// console.log(getInfo(true))
function getInfo(name:string):string;
function getInfo(name:string,age:number):string;
function getInfo(name:any,age?:any):any{
    if(age){
        return `我叫:${name},我的年龄:${age}`
    }else{
        return `我叫:${name}`
    }
}
console.log(getInfo("张三"))
console.log(getInfo("李四",22))

虽然重载看起来有点鸡肋,而且叫它重载好像又有点名不副实,但至少它会根据同名函数中设置的数据类型及参数去对传递的参数作出限制,并根据这点来作出不同的效果。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只爭朝夕不負韶華

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值