函数是 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):string
function add(x:number,y:number):number
function 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'.