文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
七、函数的类型
正确的做法
// 需要把输入和输出都考虑到 function sum(x: number, y: number): number { return x + y; } ➖➖➖➖➖➖➖➖➖函数表达式➖➖➖➖➖➖➖➖➖ let mySum = function (x: number, y: number): number { return x + y; }; // 不要混淆了 TypeScript 中的 => 和 ES6 中的 => let mySum: (x: number, y: number) => number = function (x: number, y: number): number { return x + y; }; ➖➖➖➖➖➖➖➖➖接口定义函数的形状➖➖➖➖➖➖➖➖➖ interface SearchFunc { (source: string, subString: string): boolean; } let mySearch: SearchFunc; mySearch = function(source, subString) { return source.search(subString) !== -1; } ➖➖➖➖➖➖➖➖➖可选参数➖➖➖➖➖➖➖➖➖ function buildName(firstName: string, lastName?: string) { if (lastName) { return firstName + ' ' + lastName; } else { return firstName; } } let tomcat = buildName('Tom', 'Cat'); let tom = buildName('Tom'); ➖➖➖➖➖➖➖➖➖参数默认值➖➖➖➖➖➖➖➖➖ function buildName(firstName: string, lastName: string = 'Cat') { return firstName + ' ' + lastName; } ➖➖➖➖➖➖➖➖➖剩余参数➖➖➖➖➖➖➖➖➖ // rest 参数只能是最后一个参数,关于 rest 参数,是一个数组 function push(array: any[], ...items: any[]) { items.forEach(function(item) { array.push(item); }); } let a = []; push(a, 1, 2, 3);
错误的做法
// 输入多余的(或者少于要求的)参数,是不被允许的: function sum(x: number, y: number): number { return x + y; } sum(1, 2, 3); ❌ sum(1);❌ // 输入多余的(或者少于要求的)参数,是不被允许的: function sum(x: number, y: number): number { return x + y; } sum(1, 2, 3); // 可选参数后面不允许再出现必须参数了: function buildName(firstName?: string, lastName: string) {❌ if (firstName) { return firstName + ' ' + lastName; } else { return lastName; } } let tomcat = buildName('Tom', 'Cat'); let tom = buildName(undefined, 'Tom');
7.1 函数相关知识点梳理
四种声明方式:
- 通过
function
- 通过变量
- 通过接口
- 通过类型别名
// 函数定义 function add1(x: number, y: number) { return x + y } // 通过变量 let add2: (x: number, y: number) => number // 通过类型别名 let add3 = (x: number, y: number) => number // 通过类型别名 interface add4 { (x: number, y: number): number }
用 interface 定义函数和用 type 定义函数有区别?
type
:不是创建新的类型,只是为一个给定的类型起一个名字。type
还可以进行联合、交叉等操作,引用起来更简洁interface
:创建新的类型,接口之间还可以继承、声明合并- 如果可能,建议优先使用
interface
。 - 混合接口一般是为第三方类库写声明文件时会用到,很多类库名称可以直接当函数调用,也可以有些属性和方法。例子可以看一下
@types/jest/index.d.ts
里面有一些混合接口。 - 用混合接口声明函数和用接口声明类的区别是,接口不能声明类的构造函数(既不带名称的函数),但混合接口可以,其他都一样。
函数重载
函数名相同,返回类型不同
function add8(...rest: number[]): number; function add8(...rest: string[]): string; function add8(...rest: any[]): any { let first = rest[0]; if(typeof first === 'string') { return rest.join('') } if(typeof first === 'number') { return rest.reduce((pre, cur) => pre + cur) } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论