TypeScript(十)函数重载 | 您所在的位置:网站首页 › js有重载吗 › TypeScript(十)函数重载 |
函数重载
根据参数的类型执行不同的函数 多数用于传入不同的参数得到不同的结果 重载分为两个部分(缺一不可): 声明 实现 例1:假设我们有一个函数,可以接收string类型相拼接,也可以接收number类型相加。 // 声明: function add(arg1: string, arg2: string): string function add(arg1: number, arg2: number): number // 实现: function add(arg1: string | number, arg2: string | number) { // 在实现上我们要注意严格判断两个参数的类型是否相等,而不能简单的写一个 arg1 + arg2 if(typeof arg1 === 'string' && typeof arg2 === 'string') { return arg1 + arg2; } else if(typeof arg1 === 'number' && typeof arg2 === 'number') { return arg1 + arg2; } } 复制代码注意: 如果实现部分没有严格判断,会提示此重载签名与其实现签名不兼容。 函数重载只是多个函数声明,逻辑依旧要自己写,并不会吧我们声明的多个函数进行合并。 例2写个函数test,当传入参数param是User时,不传入flag,当传入的参数是number时,传入flag interface User { name: string; age: number; } declare function test(param: User | number, flag?: boolean): number; const user = { name: 'Jack', age: 18 } const res = test(user, false)// 虽然不报错,但是与想法未被,当传入的是User时 应该不让传入flag 复制代码重载解决上述问题: interface User { name: string; age: number; } declare function test(params:User):number; declare function test(params:number, flag:boolean):number; const user = { name: 'jack', age: 666 }; // 类型"{name: string; age: number; }"的参数不能赋给类型"number"的参数。 const res = test(user, false); 复制代码 实际项目中的用法:有声明之后,需要有具体的实现 interface User { name: string; age: number; } const user:User = { name: 'jack', age: 123 } class oneClass { // 声明 public test(param: User): number; public test(param: number, flag: boolean): number; // 实现 public test(param: User | number, flag?: boolean) { if(typeof param === 'number') { return param+(flag ? 1 : 0) } else { return param.age } } } 复制代码如果仅传入的参数不同,但是得到的结果是一样的,那么重载的意义不大。 function func (a: number): number function func (a: number, b: number): number //代替上面: function func (a: number, b?: number): number 复制代码 function func (a: number): number function func (a: string): number //替代上面 function func (a: number | string): number 复制代码 |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |