1
头图

本文我们将深入探讨 函数的参数和返回值类型,这是 TypeScript 中最常用的特性之一。了解如何为函数参数和返回值添加类型,不仅能帮助你避免常见的错误,还能提高代码的可读性和可维护性。

在 JavaScript 中,函数的参数和返回值是没有强制要求类型的,这就导致了许多潜在的错误和 bug。而在 TypeScript 中,参数和返回值的类型是必须明确声明的,从而让编译器能够提前帮你捕捉到错误。

今天,我们就一起来看看如何在 TypeScript 中为函数添加参数类型和返回值类型。

为函数参数声明类型

在 TypeScript 中,声明函数参数类型非常简单。你只需要在参数后面加上冒号 :,然后指定该参数的类型。

示例:基本的参数类型

我们先来看一个简单的例子,假设我们有一个函数,它接受两个数字类型的参数并返回它们的和:

function add(a: number, b: number): number {
  return a + b;
}

console.log(add(2, 3));  // 输出 5
console.log(add(5, '3'));  // 错误:参数 '3' 不能赋值给类型 'number'

在这个例子中,函数 add 接受两个参数 ab,它们的类型都被明确声明为 number。如果我们传入一个不符合类型要求的参数(比如 '3' 是字符串),TypeScript 会在编译时报错,提示我们参数类型不匹配。

为函数返回值声明类型

除了参数外,我们还可以为函数的返回值声明类型。返回值类型同样是通过冒号 : 来声明的,它位于参数列表的后面。

示例:返回值类型

function multiply(a: number, b: number): number {
  return a * b;
}

console.log(multiply(2, 3));  // 输出 6
console.log(multiply(2, '3'));  // 错误:参数 '3' 不能赋值给类型 'number'

在这个例子中,函数 multiply 不仅声明了参数 ab 的类型为 number,同时还声明了返回值的类型为 number。如果返回值不是数字,TypeScript 会提示类型不匹配。

可选参数与默认参数

TypeScript 还允许我们给函数的参数设置默认值,或者声明某些参数为可选。

可选参数

我们可以通过在参数类型后加上 ? 来声明一个可选参数。这样,如果调用函数时没有传入该参数,它的值会被默认设为 undefined

示例:可选参数

function greet(name: string, age?: number): string {
  if (age) {
    return `Hello, ${name}. You are ${age} years old.`;
  } else {
    return `Hello, ${name}.`;
  }
}

console.log(greet("Alice"));  // 输出 "Hello, Alice."
console.log(greet("Bob", 30));  // 输出 "Hello, Bob. You are 30 years old."

在这个例子中,age 是一个可选参数。调用 greet 时,如果没有传入 age,它的值就是 undefined,但我们依然可以在函数体内进行处理。

默认参数

默认参数是指为函数的某些参数设置默认值。如果调用时没有传入这些参数,TypeScript 会自动使用这些默认值。

示例:默认参数

function greet(name: string, age: number = 25): string {
  return `Hello, ${name}. You are ${age} years old.`;
}

console.log(greet("Alice"));  // 输出 "Hello, Alice. You are 25 years old."
console.log(greet("Bob", 30));  // 输出 "Hello, Bob. You are 30 years old."

在这个例子中,age 参数有一个默认值 25,如果我们调用函数时没有传入 age,TypeScript 会自动使用默认值。

函数重载

有时我们需要根据不同的输入类型,返回不同的输出类型。在这种情况下,TypeScript 提供了 函数重载 的功能。

示例:函数重载

function greet(name: string): string;
function greet(name: string, age: number): string;

function greet(name: string, age?: number): string {
  if (age) {
    return `Hello, ${name}. You are ${age} years old.`;
  } else {
    return `Hello, ${name}.`;
  }
}

console.log(greet("Alice"));  // 输出 "Hello, Alice."
console.log(greet("Bob", 30));  // 输出 "Hello, Bob. You are 30 years old."

这里我们为 greet 函数定义了两个重载签名:一个只有 name 参数,另一个有 nameage 两个参数。然后通过实现签名的函数体来处理不同的参数组合。

使用 void 类型表示没有返回值的函数

有些函数不需要返回任何值,我们可以使用 void 类型来表示这种情况。

示例:没有返回值的函数

function logMessage(message: string): void {
  console.log(message);
}

logMessage("Hello, TypeScript!");  // 输出 "Hello, TypeScript!"

在这个例子中,logMessage 函数的返回类型是 void,表示它没有返回值。我们依然可以调用它,但 TypeScript 会确保我们没有错误地从函数中返回任何值。

使用 never 类型表示无法完成的函数

有些函数的执行可能永远不会结束,比如抛出异常的函数。我们可以使用 never 类型来表示这类函数。

示例:never 类型

function throwError(message: string): never {
  throw new Error(message);
}

throwError("Something went wrong!");  // 抛出错误

在这个例子中,throwError 函数的返回类型是 never,表示它不会正常返回,而是会抛出一个错误。

小结

本文我们深入探讨了 函数的参数和返回值类型,并学习了如何在 TypeScript 中为函数添加类型声明。

  • 为参数声明类型:可以帮助你确保函数调用时传入的参数类型是正确的。
  • 为返回值声明类型:可以确保函数返回的数据符合预期。
  • 可选参数与默认参数:使函数更加灵活,可以处理没有传入参数的情况。
  • 函数重载:允许同一个函数接受不同类型和数量的参数,并根据不同的情况返回不同的结果。
  • void 类型:表示函数没有返回值。
  • never 类型:表示函数不会正常返回,通常用于抛出异常或无限循环的函数。

通过为函数添加类型,我们可以大大提高代码的健壮性和可维护性,避免许多潜在的错误。


轻口味
35.2k 声望5.3k 粉丝

移动端十年老人,主要做IM、音视频、AI方向,目前在做鸿蒙化适配,欢迎这些方向的同学交流:wodekouwei