TypeScript中怎么写函数重载?

lxf2023-03-18 12:34:01

TypeScript中怎么写函数重载?下边本文给大家介绍一下TypeScript中函数重载书写,希望能帮助到大家!

TypeScript中怎么写函数重载?

大部分函数公式接纳一组固定不动的参数。

但是有些函数公式能接受可变性总数的参数,不同种类的主要参数,甚至可以根据自己调用函数的形式回到不一样的种类。为了能注解这种函数公式,TypeScript 带来了函数重载作用。

1. 函数签名

我们先来考虑到一个函数,它回到给一个特殊之人的问候信息。

function greet(person: string): string {
  return `Hello, ${person}!`;
}

上边的函数公式接纳1个字符类型的参数:人名字。启用该函数公式是很简单的:

greet('World'); // 'Hello, World!'

如果你想要让 greet()函数公式更加高效,该怎么办?比如,使它此外接纳一个要问好之人的目录。

这种函数公式将进行一个字符串数组或字符串数组做为主要参数,并回到一个字符串数组或字符串数组。

怎样对于这样的函数公式开展注解?有2种方式

第一种其实很简单,就是利用升级参数和返回类型立即改动函数签名。下边重新构建后greet()的模样:

function greet(person: string | string[]): string | string[] {
  if (typeof person === 'string') {
    return `Hello, ${person}!`;
  } else if (Array.isArray(person)) {
    return person.map(name => `Hello, ${name}!`);
  }
  throw new Error('Unable to greet');
}

如今我们可以通过两种形式启用 greet():

greet('World');          // 'Hello, World!'
greet(['小编', '大冶']); // ['Hello, 小编!', 'Hello, 大冶!']

立即升级函数签名以支持多种启用方法是一种常见的好办法。

但是,在某些情况下,我们也许需要采用另一种方式,各自界定你函数公式能够被调用的全部方法。此方法被称作函数重载

2.函数重载

第二种方法是什么应用函数重载作用。当函数签名相对复杂且涉及到各种类型时,我建议使用此方法。

界定函数重载必须界定轻载签字和一个完成签字。

轻载签字定义函数的形参和返回类型,并没有函数体。一个函数能够有好几个轻载签字:对应于启用该函数的不一样方法。

另一方面,完成签字还具备参数类型和返回类型,并且还有完成函数公式的核心,且也只能有一个完成签字。

// 轻载签字
function greet(person: string): string;
function greet(persons: string[]): string[];
// 完成签字
function greet(person: unknown): unknown {
  if (typeof person === 'string') {
    return `Hello, ${person}!`;
  } else if (Array.isArray(person)) {
    return person.map(name => `Hello, ${name}!`);
  }
  throw new Error('Unable to greet');
}

greet() 函数公式有两种轻载签字和一个完成签字。

每一个轻载签字都叙述了能够读取该函数公式的一种方式。就 greet()函数公式来讲,我们可以通过两种形式启用它:用一个字符串数组主要参数,或者用一个字符串数组主要参数。

完成签字 function greet(person: unknown): unknown { ... } 包括了这一函数公式如何运行的适度逻辑性。

如今,和之前一样,能用字符串数组或字符串数组种类的参数来启用 greet()

greet('World');          // 'Hello, World!'
greet(['小编', '大冶']); // ['Hello, 小编!', 'Hello, 大冶!']

2.1 轻载签字是可以调用的

尽管完成签字完成了函数公式个人行为,但它无法直接启用。仅有轻载签字是可以调用的。

greet('World');          // 轻载签字可启用
greet(['小编', '大冶']); // 轻载签字可启用

const someValue: unknown = 'Unknown';
greet(someValue);       // Implementation signature NOT callable

// 出错
No overload matches this call.
  Overload 1 of 2, '(person: string): string', gave the following error.
    Argument of type 'unknown' is not assignable to parameter of type 'string'.
  Overload 2 of 2, '(persons: string[]): string[]', gave the following error.
    Argument of type 'unknown' is not assignable to parameter of type 'string[]'.

在后面的实例中,即便完成签字接纳unknown主要参数,也无法使用为非 unknown (greet(someValue)) 的参数启用 greet() 函数公式。

2.2 完成签字一定要通用

// 轻载签字
function greet(person: string): string;
function greet(persons: string[]): string[]; 
// 此轻载签字与其说完成签字兼容问题。

// 完成签字
function greet(person: unknown): string {
  // ...
  throw new Error('Unable to greet');
}

轻载签字函数公式 greet(person: string[]): string[] 被标记为与greet(person: unknown): string兼容问题。

完成签字的 string 返回类型不足通用性,不能和轻载签字的 string[] 返回类型适配。

3.方法重载

尽管在之前的例子中,函数重载被用于一个普通函数公式。可是我们还可以轻载一个方法

在方法重载区段,轻载签字和实现签名全是类一部分了。

比如,大家实现一个 Greeter类,有一个重载方法greet()

class Greeter {
  message: string;
  constructor(message: string) {
    this.message = message;
  }
  // 轻载签字
  greet(person: string): string;
  greet(persons: string[]): string[];
  // 完成签字
  greet(person: unknown): unknown {
    if (typeof person === 'string') {
      return `${this.message}, ${person}!`;
    } else if (Array.isArray(person)) {
      return person.map(name => `${this.message}, ${name}!`);
    }
    throw new Error('Unable to greet');
  }

Greeter 类包括 greet() 重载方法:2个轻载签字叙述怎样启用此方法,及其包括恰当完成的实现签字

因为方法重载,我们可以通过两种形式启用 hi.greet():使用一个字符串数组或使用一个字符串数组做为主要参数。

const hi = new Greeter('Hi');
hi.greet('小编');       // 'Hi, 小编!'
hi.greet(['王大冶', '大冶']); // ['Hi, 王大冶!', 'Hi, 大冶!']

4. 什么时候应用函数重载

函数重载,如果采用恰当,能够大大增加很有可能以多种形式调用的函数的易用性。这一点在自动补全时非常实用:我们将在自动补全中列举全部可能性的轻载纪录。

但是,在某些情况下,不建议应用函数重载,而应该使用函数签名。

比如,不能对可选参数应用函数重载:

// 不建议作法
function myFunc(): string;
function myFunc(param1: string): string;
function myFunc(param1: string, param2: string): string;
function myFunc(...args: string[]): string {
  // implementation...
}

在函数签名中应用可选参数是充足的:

// 强烈推荐作法
function myFunc(param1?: string, param2: string): string {
  // implementation...
}

5.汇总

TypeScript里的函数重载使我们界定以多种形式调用的函数公式。

应用函数重载必须界定轻载签字:一组含有参数和返回类型的函数公式,但却没有行为主体。这种签字说明该如何启用该函数公式。

除此之外,你需要写下函数的恰当完成(完成签字):参数和返回类型,及其函数体。一定要注意,完成签字是无法调用的。

除了常规的函数公式以外,类里的方式还可以轻载。

英文原文详细地址:https://dmitripavltin.com/typeript-function-overloading/

创作者: dmitripavlutin

译员:前面小编

大量程序编写基本知识,请访问:编程学习!!

以上就是关于TypeScript中怎么写函数重载?书写推荐的具体内容,大量欢迎关注AdminJS其他类似文章!