当前位置: 首页 > 科技观察

面试官:谈谈你对TypeScript中函数的理解?它与JavaScript函数有何不同?

时间:2023-03-21 19:51:42 科技观察

本文转载自微信公众号《JS日报》,作者灰灰。转载本文请联系JS每日一问公众号.1.什么函数是JavaScript应用的基础,帮助我们实现抽象层、模拟类、信息隐藏和模块在TypeScript中,虽然已经支持类、命名空间和模块,但函数仍然是定义行为的主要方式,TypeScript增加了额外的功能functions到JavaScriptfunctions,丰富了更多的应用场景。函数类型在TypeScript类型系统中扮演着非常重要的角色。它们是可组合系统的核心构建块。2.使用方法和javascript定义函数很相似,可以通过funciton关键字,箭头函数等来定义。例如下面这个简单的加法函数:constadd=(a:number,b:number)=>a+b以上只定义了函数的两种参数类型。这时候虽然整个函数没有显式定义,但是TypeScript编译器其实可以通过类型推断出这个函数的类型,如下图:当鼠标放在第三行添加函数名时,完整的函数定义时会出现Type,参数类型以:的形式定义,参数和返回值类型由=>连接当我们不提供函数实现时,有两种方式声明函数类型,如下图://方法一typeLongHand={(a:number):number;};//方法二typeShortHand=(a:number)=>number;当有函数重载时,当函数的参数可能不存在时,只能使用方法1的形式可选参数是的,只需要加上?参数后表示参数可能不存在,如下:constadd=(a:number,b?:number)=>a+(b?b:0)此时参数b可以是number类型或者undefined类型,即可以传也可以不传数字类型。其余类型类似于JavaScript的语法。您需要使用...来表示剩余的参数。如果剩下的参数rest是由number类型组成的数组,则表示为:constadd=(a:number,...rest:number[])=>rest.reduce(((a,b)=>a+b),a)函数重载允许创建几个同名但输入输出类型或数量不同的子程序,它可以简单地称为一个可以执行多个任务的函数。关于typescript函数重载,首先要有准确的定义。函数实现时,需要使用|手术运营商或?运算符,其中包括所有可能的输入类型。用来实现这个的函数重载只是多个函数的声明。具体逻辑需要自己写。Typescript不会真正将你合并多个同名函数的函数体。比如我们有一个add函数,它可以接收string类型的参数进行拼接,也可以接收number类型的参数进行相加,如下://以上是函数add(arg1:string,arg2:string)的声明:stringfunctionadd(arg1:number,arg2:number):number//因为我们下面有具体函数的实现,所以这里不需要加上declare关键字//下面是functionadd(arg1:string|的实现number,arg2:string|number){//在实现上要严格判断两个参数的类型是否相等,而不是简单的写成arg1+arg2if(typeofarg1==='string'&&typeofarg2==='string'){returnarg1+arg2}elseif(typeofarg1==='number'&&typeofarg2==='number'){returnarg1+arg2}}3.从上面可以看出区别:在定义上,typescript声明了函数需要定义参数类型或声明返回值类型typescript在参数中,添加可选的para供用户选择typescript添加函数重载功能的米,用户只需查看函数声明即可知道函数传递的参数个数和Type参考https://www.tslang.cn/docs/handbook/functions.htmlhttps://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E9%87%8D%E8%BD%BDhttps://jkchao.github.io/typescript-book-chinese/typings/functions.html#%E9%87%8D%E8%BD%BD