typeScript中的函数

函数是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)

这个箭头函数,没什么要说的,就和之前的一样

本文的最后按照惯例来推荐歌曲了,周杰伦的《手写的从前》,希望你能对那个人说出,“我想我属于一个拥有你的未来,你是我未来的规划之一”,我们下一章再见。

你可能感兴趣的:(typeScript中的函数)