TypeScript(三)函数

71 阅读2分钟

函数

函数就是包裹在花括号中的代码块,前面使用了关键词 function。

函数返回值

在使用 return 语句的时候,函数会停止执行,并返回指定的值。

function greet(): string {
  return "Hello World";
}

定义了函数 greet(),返回值的类型为 string

带参数的函数

function add(x: number, y: number): number {
  return x + y;
}

定义了函数 add(),返回值的类型为 numberadd() 函数中定义了两个 number 类型的参数,函数内将两个参数相加并返回。

可选参数和默认参数

可选参数

在 ts 函数中,如果我们定义了参数,则我们必须传入这些参数,除非将这些参数设置为可选,可选参数使用问号标识 ?

function multi(x: number, y: number): number {
  return x * y;
}

multi(1); // error 未提供 "y" 的自变量。

function add(x: number, y?: number): number {
  return x + (y ? y : 0);
}

add(1);
默认参数

函数设置了默认值的参数,就是可选的。如果不传入该参数,它就会等于默认值。

function multi(x: number = 1, y: number = 1) {
  return x * y;
}

multi(1);

默认值与可选参数不能同时使用

// error 参数不能包含问号和初始化表达式
function multi(x: number, y?: number = 1) {
  return x * y;
}

rest 参数

有一种情况,我们不知道要向函数传入多少个参数,这时候我们就可以使用剩余参数来定义,剩余参数语法允许我们将一个不确定数量的参数作为一个数组传入。

function maxNum(x: number, ...rest: number[]): number {
  return Math.max(x, ...rest);
}

函数重载

有些函数可以接受不同类型或不同个数的参数,并且根据参数的不同,会有不同的函数行为。这种根据参数类型不同,执行不同逻辑的行为,称为函数重载 function overload

function area(w: number, h: number): number;
function area(rect: { w: number; h: number }): number;
function area(v1: any, v2?: any) {
  if (typeof v1 === "object") {
    const { w, h } = v1;
    return w * h;
  }

  return v1 * v2;
}

void 返回类型

void 类型表示函数没有返回值,但是允许函数返回undefinednull(假定没有打开 strictNullChecks) 。

function func(): void {}

// 允许函数返回 undefined
function func1(): void {
  return undefined;
}

// 函数的运行结果如果是抛出错误,也允许将返回值写成void。
function func2(): void {
  throw new Error("未知错误");
}

// 打开 strictNullChecks 的情况,没打开的情况下面不会报错。
function func3(): void {
  return null; // error 不能将类型“null”分配给类型“void”
}

function func4(): void {
  return true; // error 不能将类型“boolean”分配给类型“void”
}