一、概述

函数是 JavaScript 应用程序的基础。 它帮助你实现抽象层,模拟类,信息隐藏和模块。 TypeScript 为 JavaScrip t函数添加了额外的功能,让我们可以更容易地使用。

二、定义

首先我们来看一下在 TypeScript 中定义函数类型的语法:

  1. (参数1:参数1类型, 参数2:参数2类型, ...) => 返回值类型

比如:

type FuncType = (a: number, b: number) => number;

const sum: FuncType = function (a: number, b: number) {
    return a + b;
}

上述示例中,FuncType 表示 接受两个数值类型的参数,并且返回一个数值类型的值 的函数。

三、推断函数类型

实际上,我们在定义函数时,不会这么麻烦,而是直接让 TypeScript 去推断类型即可:

// 推断类型为:() => void
function sayHi() {
    console.log("Hi");
}

// 推断类型为:(name: string) => void
function sayHiWith(name: string) {
    console.log(`Hi, ${name}!`);
}

当然,箭头函数也是如此:

// 推断类型为:() => void
const sayHi = () => {
    console.log('Hi');
}

四、默认参数 & 可选类型

在 TypeScript 中使用默认参数特别简单,可以直接使用 ES6 语法:

// 推断类型为:(name: string, gender?: string) => void
function description(name: string, gender = '保密') {
    console.log({ name, gender })
}

description("Li-HONGYAO"); // { name: 'Li-HONGYAO', gender: '保密'}
description("Li-HONGYAO", "male"); // { name: 'Li-HONGYAO', gender: 'male'}

定义函数时,如果为某一参数设置了默认值,则该参数会被推断为 可选类型,所谓可选类型,就是说可以不实现。可选类型使用 ? 表示,跟在变量名后。

五、剩余参数

必要参数,默认参数和可选参数有个共同点:它们表示某一个参数。 有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来。 在JavaScript里,你可以使用 arguments 来访问所有传入的参数。在 TypeScript 里,你可以把所有参数收集到一个变量里:

我们直接通过一个示例来查看函数类型:

function desc(name: string, ...rest:Array<any>): void {
    console.log(name, rest);
}

六、函数重载

JavaScript本身是个动态语言。 JavaScript里函数根据传入不同的参数而返回不同类型的数据是很常见的。

关于函数重载,必须要把精确的定义放在前面,最后函数实现时,需要使用 |操作符或者?操作符,把所有可能的输入类型全部包含进去:

function reverse(message: string): string;
function reverse(message: Array<any>): string;
function reverse(message: string | Array<any>): string {
    if(typeof message === "string") {
        return message.split("").reverse().join("");
    }else {
        return message.reverse().join("");
    }
}
console.log(reverse("123")) // 321
console.log(reverse([1, 2, 3])) // 321