TypeScript的基础知识5---数组与函数的类型

249 阅读3分钟

1、数组的类型

在 TypeScript 中,数组类型有多种定义方式,比较灵活。

「类型 + 方括号」表示法

let fibonacci : number[] = [1,2,3,4,5,6]

数组的项中不允许出现其他的类型。

数组泛型

我们也可以使用数组泛型(Array Generic) Array<elemType> 来表示数组:

let fibonacci: Array<number>  = [1,2,3,4,5]

用接口表示数组

接口也可以用来描述数组:

interface NumberArray {
    [index:number]:number;
}
let fibonacci : NumberArray = [1,2,3,4]

NumberArray 表示:只要索引的类型是数字时,那么值的类型必须是数字。

虽然接口也可以用来描述数组,但是我们一般不会这么做,因为这种方式比前两种方式复杂多了。

不过有一种情况例外,那就是它常用来表示类数组。

any 在数组中的应用

一个比较常见的做法是,用 any 表示数组中允许出现任意类型:

let list: any[] = [
    'xcatliu', 
    25, 
    { website: 'http://xcatliu.com' }
];

2、函数的类型

函数声明

在 JavaScript 中,有两种常见的定义函数的方式——函数声明(Function Declaration)和函数表达式(Function Expression):

// 函数声明
function sum (x,y){
    return x + y
}
//函数表达式
let mySum = function (x,y){
    return x + y 
}

一个函数有输入和输出,要在 TypeScript 中对其进行约束,需要把输入和输出都考虑到,其中函数声明的类型定义较简单:

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

函数表达式

如果要我们现在写一个对函数表达式(Function Expression)的定义,可能会写成这样:

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

这是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义,而等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的。如果需要我们手动给 mySum 添加类型,则应该是这样:

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

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

用接口定义函数的形状

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

interface SearchFunc {
    (source:string,subString:string):boolean;
}

let mySearch : SearchFunc;
mySearch = function (source:string,subString:string){
    return source.search(subString) !== -1
}

采用函数表达式|接口定义函数的方式时,对等号左侧进行类型限制,可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变。

可选参数

前面提到,输入多余的(或者少于要求的)参数,是不允许的。那么如何定义可选的参数呢?

与接口中的可选属性类似,我们用 ? 表示可选的参数:

function buildName(first:string,lastName?:string){
    if(lastName){
        return firstName + ' '+ lastName;
    }else{
        return firstName;
    }
}

let tomcat = buildName ('tom','cat')
let tom = buildName('tom')

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

参数默认值

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

function buildName(first:string,lastName:string = 'cat'){
    if(lastName){
        return firstName + ' '+ lastName;
    }else{
        return firstName;
    }
}

let tomcat = buildName ('tom','cat')
let tom = buildName('tom')