function关键字声明

  1. function fn(x: number, y: number): number {
  2. return x + y;
  3. }

一般还是这种方式更多一些

函数表达式的声明

  1. let fn: (x: Number, y: Number) => number = function (x: number, y: number): number {
  2. return x + y;
  3. };

完整的声明是这样的,类似于对象,我们要定义一个接口,然后给一个变量定义它的类型,然后进行赋值
注意中间的箭头,与es6中的箭头函数不同,在表示类型的情况下,箭头是用来表示返回值的类型的,当然在函数的中还是可以使用的

不过下面这种方式也可以通过编译,因为ts会进行类型推断,因此myFn的类型被推断为函数

  1. let myFn = function (x: number, y: number): number {
  2. return x + y;
  3. };

接口定义函数

因为js中函数也是对象,因此可以用接口来定义函数

  1. interface fn {
  2. (x: number, y: number): number;
  3. }
  4. //报错
  5. let myFn: fn = function (z: string, q: number):string {
  6. return z + q;
  7. };

另外,定义好的参数是不能多或者少的,这意味着与js不同,js中定义了两个参数,但是可以传入三个参数,而ts中定义了几个参数那么就只能传入几个参数

可选参数

但是可以在函数中使用 ? 来表示参数的可选,注意可选参数后不允许出现必选参数

  1. interface fn {
  2. (x: number, y?: number): number;
  3. }
  4. let myFn: fn = function (l: number, m?: number): number {
  5. if (m) {
  6. return l + m;
  7. } else {
  8. return l;
  9. }
  10. }
  11. myFn(1);
  12. myFn(1, 2);

使用默认值代替可选参数

由于可选参数有之后不能出现必选参数的限制,因此可以使用默认值的方式代替可选参数,因为不传参就等于默认值,因此不使用 ? 也没关系
这样也没有可选参数后不能出现必选参数的限制,因为有默认值打底了

  1. interface fn {
  2. (x: number, y?: number): number;//不能缺少问号
  3. }
  4. let myFn: fn = function (l: number, m: number = 1): number {
  5. if (m) {
  6. return l + m;
  7. } else {
  8. return l;
  9. }
  10. };
  11. myFn(1);
  12. myFn(1, 2);

只是,默认值只是在给函数编写内容的使用用,定义接口的时候还是需要 ? 的

剩余参数

ts中的剩余参数和js中的使用方法一样,只是也需要类型的定义

  1. function fn(l: number, m: number, ...rest: number[]): number {
  2. return (
  3. l + m + rest.reduce((pre, cur) => {
  4. return pre + cur;
  5. })
  6. );
  7. }
  8. console.log(fn(1, 2, 3, 4, 5, 6, 7, 8, 9));//45

函数重载

重载就是根据传入的参数的类型、数量不同,而选择不同的方法
与其它语言中的重载不同,ts的重载是在函数实现的过程中显示的进行的
声明是可以重复的,但是实现是不可以重复的

  1. function log(x: number): void;
  2. function log(x: string): void;
  3. function log(x: number | string): void {
  4. if (typeof x === "number") {
  5. console.log("这是数字");
  6. } else {
  7. console.log("这是字符串");
  8. }
  9. }
  10. log(1);
  11. log("1");

如上,前两次都是函数的定义,定义类型和返回值,第三次是函数的实现
在第三次函数的实现中,显示的对x的类型进行检测,而选择不同的方法,这就是ts中函数的重载