函数是 JavaScript 应用程序的基础,将程序中重复的代码通过函数封装起来,提高代码复用。
基本示例
和 JavaScript 一样,TypeScript 函数可以创建有名字的函数和匿名函数。 TypeScript支持原生的JavaScript函数格式
(() => {// 命名函数(函数声明)function add(x, y) {return x + y}// 匿名函数(函数表达式)let myAdd = function (x, y) {return x + y;}// 调用命名函数console.log(add(1,2))// 调用匿名函数console.log(myAdd(2,3))})()// 输出结果// 3// 5
函数类型
TypeScript是一门强类型语言,推荐在使用函数时,给函数的参数和返回值指定类型
(() => {// 命名函数(函数声明)function add(x:string, y:string):string {return x + y}// 匿名函数(函数表达式)let myAdd = function (x:number, y:number):number {return x + y;}// 调用命名函数console.log(add('1','2'))// 调用匿名函数console.log(myAdd(2,3))})()// 输出结果// 12// 5
完整写法
(() => {// myAdd——变量名// (x: number, y: number) => number——当前这个myAdd函数的类型// function (x: number, y: number): number { return x + y }——符合上面这个函数类型的值let myAdd: (x: number, y: number) => number = function (x: number, y: number): number {return x + y}// 调用函数console.log(myAdd(2, 3))})()// 输出结果// 5
可选参数和默认参数
默认参数:函数在声明的时候,内部的参数用=指定一个默认值,表示该参数是默认参数 可选参数:函数在声明的时候,内部的参数用?修饰,表示该参数可有可无 示例:定义一个函数,传入姓氏和名字,得到姓名
- 需求:如果不传入任何内容,返回默认的姓氏(姓氏默认参数)
- 需求:如果只传入姓氏,就返回姓氏(名字可选参数)
- 需求:如果传入姓氏和名字,就返回姓名
(() => {let fullName = function (firstName: string = '诸葛', lastName?: string): string {// 判断是否传入了名字if (lastName) {return firstName + '-' + lastName} else {return firstName}}// 什么也不传入console.log(fullName())// 传入姓氏console.log(fullName('欧阳'))// 传入姓氏和名字console.log(fullName('欧阳', '峰'))})()// 输出结果// 诸葛// 欧阳// 欧阳-峰
剩余参数
有时,你想同时操作多个参数,或者你并不知道会有多少参数传递进来。 在 TypeScript 里,你可以把所有参数收集到一个变量里:
剩余参数会被当做个数不限的可选参数。 可以一个都没有,同样也可以 有任意个。
(() => {function showMsg(str1: string, str2: string, ...other: string[]): void {console.log(str1)console.log(str2)console.log(other)}showMsg('欧', '杨', '峰', '是', '好', '人', '吗')})()// 输出结果// 欧// 杨// (5) ["峰", "是", "好", "人", "吗"]
函数重载
函数名字相同,但函数的参数和个数不同
需求:定义一个函数,当传入两个string时,进行拼接。当传入两个number时,进行相加。
(() => {// 函数重载声明function add(x:string,y:string):stringfunction add(x:number,y:number):numberfunction add(x: string|number, y: string|number): string|number {if (typeof x==='string' && typeof y==='string'){return x+y //字符串拼接}else if (typeof x==='number' && typeof y==='number'){return x+y //数字相加}}console.log(add('1','2'))console.log(add(1,2))// 如果传入数据非法,ts编译直接报错console.log(add('1',2))})()// 输出结果// 12// 3// Overload 1 of 2, '(x: string, y: string): string', gave the following error.// Argument of type 'number' is not assignable to parameter of type 'string'.// Overload 2 of 2, '(x: number, y: number): number', gave the following error.// Argument of type 'string' is not assignable to parameter of type 'number'.
