TypeScript-入门教程(5)

343 阅读2分钟

函数类型

函数是 JavaScript 中的一等公民

1.函数声明

JavaScript中两种常见的定义函数的方式:函数声明和函数表达

// 函数声明(Function Declaration)
function sum(x, y) {
    return x + y;
}

// 函数表达式(Function Expression)
let mySum = function (x, y) {
    return x + y;
};

在TypeScript中函数如果有输入和输出,那么则要对其输入和输出的值进行约束,函数声明定义的较为简单:

function sum(x:number,y:number):number{
   return x+y;
}

其中我们限制了传入的x,y的参数必须为Number类型的数值,同时我们返回值的类型也必须是Number类型。 注意:输入多余的(或者少于要求的)参数,是不被允许的

2.函数表达式

如果我们用函数表达式定义一个函数,可能是这样的:

let mySum=function(x:number,y:number):number{
  return x+y;
}

这是可以通过编译的,不过事实上,我们只是给等号右边的匿名函数进行了类型定义,而等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的。所以应该修改为这样:

let mySum: (x: number, y: number) => number = function (x: number, y: number): number {
    return x + y;
};

注意不要混淆了 TypeScript 中的 => 和 ES6 中的 =>

在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。

在 ES6 中,=> 叫做箭头函数,应用十分广泛.

3.用接口定义函数的形状

我们也可以使用接口的方式来定义一个函数需要符合的形状:

interface SearchFunc {
    (s1: string, s2: string): boolean;
}

let mySearch: SearchFunc;
mySearch = function(s1: string, s2: string) {
    return s1.search(s2) !== -1;

接口SearchFunc中定义了参数的类型以及返回值的类型。

4.可选参数

我们指导参数多传或者是少传都是不被允许的,那么我们就可以设置可选参数,用?来表示:

function getName(n1:string,n2?:string):string{
   if(n2){
      return n1+n2;
    }else{
       return n1;
    }
}
getName("Tom","Jack"); //TomJack
getName(undefined,"James") //James

注意:可选参数必须是在必须参数的后面,换句话说,可选参数后面不允许再出现必需参数了

function getName(n1?:string,n2:string):string{
   if(n1){
      return n1+n2;
    }else{
       return n2;
    }
}
getName("Tom","Jack"); //TomJack
getName(undefined,"James") //error

5.参数默认值

在 ES6 中,我们允许给函数的参数添加默认值,TypeScript 会将添加了默认值的参数识别为可选参数

function setName(n1:string,n2:string="Harden"):string{
     return n1+n2;
}
setName("Kobe","Bryant")// KobeBryant
setName(undefined,"James") // JamesHarden

此时就不受可选参数必须接在必需参数后面的限制了:

function setName(n1:string="Paul",n2:string):string{
     return n1+n2;
}
setName("Lerbon","James")// LerbonJames
setName(undefined,"James") // PaulJames