> 文章列表 > 23、ts中的函数,ts对函数进行约束,可选参数,参数默认值, 剩余参数,函数重载

23、ts中的函数,ts对函数进行约束,可选参数,参数默认值, 剩余参数,函数重载

23、ts中的函数,ts对函数进行约束,可选参数,参数默认值, 剩余参数,函数重载

函数非为声明式和表达式

声明式:

function sum(x, y) {return x + y
}

函数表达式

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

ts对函数进行约束

1、 函数有输入和输出,所以对输入和输出都已经进行约束
2、参数多余或者少于既定参数,都是会发生报错

声明式处理:

function sum(x: number, y:number): number {return x  + y
}
// sum(1)  // 报错:  No overload expects 1 arguments, but overloads do exist that expect either 0 or 2 arguments
// sum(1,2,3)  // 报错: Expected 0-2 arguments, but got 3.

函数表达式:

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

这是可以通过编译的,不过事实上,上面的代码只对等号右侧的匿名函数进行了类型定义
而等号左边的 mySum,是通过赋值操作进行类型推论而推断出来的。

函数表达式正确的书写;

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

注意不要混淆了 TypeScript 中的 => 和 ES6 中的 =>。
在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型

用接口定义函数形状

1、可以使用接口的方式来定义一个函数需要符合的形状

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

interface SearchStr {(source: string, targe: string): boolean
}let mySearch: SearchStr;
mySearch = function(source: string, targe: string) {return source.search(targe) !== -1
}

可选参数

参数多传或者少传都是不被允许的,那么怎么定义可选参数?

1、可选参数必须写在最后面

function buildName(firstName: string, lastName?: string) {if(lastName) {return firstName+ ''+ lastName}else {return firstName}
}
let tamcat = buildName('tom', 'cat')
let tom = buildName('tom')

参数默认值

1、添加了默认值参数,会被识别为可选参数 (此时就不必受可选参数必须写在最后面的控制了)

function myName1 (xing:string,ming:string='kl') {return xing+ ming
}
let a = myName1("a",'b')
let b = myName1("a")function myName2 (xing:string ='1', ming:string) {return xing + ming
}
let c = myName2("a",'b')
let d = myName2(undefined, 'lll')

剩余参数

function res(array:any[],...items:any[]) {items.forEach(function(item) {array.push(item)})
}
let p:any[] = []
res(p,1,2,3,)

函数重载(函数可以进行不同的处理)

function fanzhuan(x:number|string): number| string| void {if(typeof x === 'number') {return Number(x.toString().split('').reverse().join())}else if(typeof x === 'string') {return x.split('').reverse().join()}
}

上述代码有个缺点:不容易读
在ts中函数其实是可以重复定义的,重复定义达到已读的目的

function fanzhuan1(x:string) : string
function fanzhuan1(x:number) : number
function fanzhuan1(x:number|string): number| string| void {if(typeof x === 'number') {return Number(x.toString().split('').reverse().join())}else if(typeof x === 'string') {return x.split('').reverse().join()}
}