函数是JavaScript应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 在TypeScript里,虽然已经支持类,命名空间和模块,但函数仍然是主要的定义行为的地方。 TypeScript为JavaScript函数添加了额外的功能,让我们可以更容易地使用。
我们先来回忆一下JavaScript的函数,有匿名函数和有名字的函数,和JavaScript一样,TypeScript函数可以创建有名字的函数和匿名函数。 你可以随意选择适合应用程序的方式,不论是定义一系列API函数还是只使用一次的函数。
// 有名函数
function add(x, y) {
return x + y;
}
// 匿名函数
let myAdd = function(x, y) { return x + y; };
在JavaScript里,函数可以使用函数体外部的变量。 当函数这么做时,我们说它‘捕获’了这些变量。
let z = 100;
function addToZ(x, y) {
return x + y + z;
}
以上是JavaScript定义函数的方法,接下来就是ts里面定义函数的方法
一、ts定义函数
//函数声明法
function run():string{
return 'run'
}
定义的是什么返回类型,返回类型必须和定义的一致,不然会报错,举个错误的例子:
//错误写法
function run():string{
return 123
}
我们再来看下怎么定义匿名函数:(和定义有名函数一样,根据定义的类型返回相应的类型)
var run2 = function():number{
return 123
}
二、ts中定义方法的传参
有名函数的传参:
function getInfo(name:string,age:number):string{
return `${name} --- ${age}`
}
getInfo('张三',18)
匿名函数传参:
var getInfo1 = function(name:string,age:number):string{
return `${name} --- ${age}`
}
getInfo1('张三',18)
解析:传递参数的时候,对参数定义类型,就比如我上面定义了name的类型是个字符串类型,age类型是个数字类型,所以我们调取方法的时候,根据类型对应好传参,是不会报错的,但是如果明明要求传字符串类型,却写了数字类型,就会报错啦。
这里再拓展说明一下,还有一种,是不会有返回值的方法:
function run3():void{
console.log('没有返回值')
}
三、ts方法可选参数
es5里面的方法的实参和形参可以不一样,但是ts中必须一样,如果不一样就要配置可选参数。
那么上面这句话是什么意思呢,我们来举个例子:假如说,我们现在要传名字和年龄,那我如果不想传年龄过去,我们可以怎么写呢
function getInfo2(name:string,age:number):string{
if(age){
return `${name} --- ${age}`
}else{
return `${name}--- 年龄保密`
}
}
getInfo2('张三',17)
解析:如果我们像上面这么写的话,和正常传参一样,不过里面加上了if的判断而已,但是如果我们不传17,就会报错了,说明这种写法并不正确。所以ts给出了一个新的形式,就是在可传参数的后面加上一个?。就如同下面的写法:
function getInfo2(name:string,age?:number):string{
if(age){
return `${name} --- ${age}`
}else{
return `${name}--- 年龄保密`
}
}
getInfo2('张三')
注意:这里还有个需要注意的地方,就是这个可选参数必须配置到参数的后面,什么意思呢,就是说如果name是可传的,age是必传的,那么就会报错,因为ts需要我们对应
//错误写法
function getInfo2(name?:string,age:number):string{
if(age){
return `${name} --- ${age}`
}else{
return `${name}--- 年龄保密`
}
}
getInfo2(18)
当然了,这里有同学就会问了,那我name可传,age也可传,可不可以呢,如果你最后传的值都是没有的,比如getInfo2()或者是getInfo2('张三'),这样是可以的,但是写成getInfo2(18),那就不行了,原因就和上面举的例子一样。
四、ts默认参数
es5里面没法设置默认参数,es6和ts中都可以设置默认参数。
这个默认参数和上面的可选参数类似,你称为默认可选参数都可以。
function getInfo3(name:string,age:number=20):string{
if(age){
return `${name} --- ${age}`
}else{
return `${name} --- 年龄保密`
}
}
getInfo3('张三')
分析:默认参数,顾名思义,就是传入的值一开始就有,就比说这里,name是string类型,age是number类型,但是给了一个20的初始值,所以,传参数的时候,即使你没有传递,后面的age,运行的时候也可以将默认的age = 20,赋值上去,当然了,如果你后面要再传age,就比如getInfo3('张三',18),也是可以的,会覆盖掉默认值。你也可以age写在前面,number写后面,只要传参对应好,都可。
五、ts剩余参数
有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来。 在JavaScript里,你可以使用arguments来访问所有传入的参数。
在TypeScript里,你可以把所有参数收集到一个变量里。
首先,大家可以看下面的一个例子:
function sum(a:number,b:number,c:number,d:number):number{
return a+b+c+d
}
sum(1,2,3,4)
分析:这种非常的简单,传入abcd,四个参数,求和,那么问题来了,如果我要求和的数非常的,我一个个写,是不是过于麻烦了点,所以,这里,ts,给我了一个简便的写法,三点运算符。
function sum1(...result:number[]):number{
var sum = 0
for(var i = 0;i
分析:传入的1234实际上,就已经存在了result数组里面了,经过循环相加,得到我们想要的求和。
再比如说,下面的这种情况,一一对应关系,a = 1,b=2,那么result数组就是[3,4],所以我们最后得到的和是和上面的sum1函数一样的。
function sum2(a:number,b:number,...result:number[]):number{
var sum = a+b
for(var i = 0;i
六、ts函数重载
java中方法的重载,重载指的是两个或者两个以上同名函数,但它们的参数不一样,这是会出现函数重载的情况。
typeScript中的重载,通过为同一个函数提供多个函数类型定义来试下多种功能的目的。
ts为了兼容es5,以及es6重载的写法和java中有区别
function css(){
return '第一个函数'
}
function css(config){
return '第二个函数'
}
上述代码,返回的会是第二个函数
function getInfos(name:string):string;
function getInfos(age:number):number;
function getInfos(str:any):any{
if(typeof str === 'string'){
return '我叫'+str
}else{
return '我的年龄是'+str
}
}
getInfos('张三') //正确写法
getInfos(20) //正确写法
getInfos(true) //错误写法
解析:一个比较简答的例子,按照顺序执行下来,肯定是执行最后一个函数里面的方法,但是如果你传入的类型,和之前传入的参数类型对应不上,就会报错。
我们还能最拓展一下,巩固记忆:
function getInfoss(name:string):string;
function getInfoss(name:string,age:number):string;
function getInfoss(name:any,age?:any):any{
if(age){
return '我叫'+ name + '我的年龄是'+age
}else{
return '我叫'+ name
}
}
getInfos('张三') //正确写法
getInfos(20) //错误写法
getInfos('张三',20) //正确写法
我觉得ts函数重载,只是多了一个参数校验的功能(只是个人想法)
七、ts箭头函数
箭头函数里面的this,指向的是上下文
setTimeout(function(){
alert('run')
},1000)
setTimeout(()=>{
alert('run')
},1000)
这个箭头函数,没什么要说的,就和之前的一样
本文的最后按照惯例来推荐歌曲了,周杰伦的《手写的从前》,希望你能对那个人说出,“我想我属于一个拥有你的未来,你是我未来的规划之一”,我们下一章再见。