广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >TypeScript中函数重载写法
  • 934
分享到

TypeScript中函数重载写法

2024-04-02 19:04:59 934人浏览 薄情痞子
摘要

目录1. 函数签名 2.函数重载 2.1 重载签名是可调用的 2.1 实现签名必须是通用的 3.方法重载 4. 何时使用函数重载 5.总结前言: 大多数函数接受一组固定的参数。但有些

前言:

大多数函数接受一组固定的参数。但有些函数可以接受可变数量的参数,不同类型的参数,甚至可以根据你调用函数的方式返回不同的类型。为了注释这样的函数,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.1 实现签名必须是通用的


// 重载签名
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中的函数重载让我们定义以多种方式调用的函数。

使用函数重载需要定义重载签名:一组带有参数和返回类型的函数,但没有主体。这些签名表明应该如何调用该函数。

此外,你必须写出函数的正确实现(实现签名):参数和返回类型,以及函数体**。请注意,实现签名是不可调用的。**

除了常规的函数之外,类中的方法也可以重载。

到此这篇关于TypeScript中函数重载写法的文章就介绍到这了,更多相关TypeScript函数重载内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: TypeScript中函数重载写法

本文链接: https://www.lsjlt.com/news/159642.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • TypeScript中函数重载写法
    目录1. 函数签名 2.函数重载 2.1 重载签名是可调用的 2.1 实现签名必须是通用的 3.方法重载 4. 何时使用函数重载 5.总结前言: 大多数函数接受一组固定的参数。但有些...
    99+
    2022-11-12
  • TypeScript中如何写函数重载
    本篇内容介绍了“TypeScript中如何写函数重载”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!大多数函...
    99+
    2022-10-19
  • 如何解析TypeScript中函数重载写法
    今天就跟大家聊聊有关如何解析TypeScript中函数重载写法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言:大多数函数接受一组固定的参数。但有些函数可以接受可变数量的参数,不同...
    99+
    2023-06-25
  • Typescript函数重载的实现
    目录函数重载的优点函数重载的适用场景定义与使用函数重载示例1示例2工作中我们往往看见一些别人造好的 轮子, 常常一个函数却有着非常多的调用方式、使用也非常的灵活。今天给大家讲解的就是...
    99+
    2023-05-16
    Typescript 函数重载
  • Typescript函数重载怎么实现
    这篇文章主要介绍“Typescript函数重载怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Typescript函数重载怎么实现”文章能帮助大家解决问题。函数重载的优点函数重载的最大优点在于...
    99+
    2023-07-06
  • TypeScript 使用 Tuple Union 声明函数重载
    问题: TypeScript 中为函数添加多个签名后,依然需要添加相应的代码来判断并从不同的签名参数列表中获取对应的参数。过去常见的写法: function refEventEmit...
    99+
    2022-11-13
  • TypeScript 泛型重载函数的使用方式
    目录前言TypeScript 的运行环境1. ts-node2. tscTypeScript 中的函数重载简单的排序算法1. 快速排序2. 中文排序3. 字符串自排序4. 通过泛型整...
    99+
    2022-11-13
    TypeScript 泛型重载函数使用方式 TypeScript 泛型重载函数
  • TypeScript中怎么使用Tuple Union声明函数重载
    这篇文章主要介绍“TypeScript中怎么使用Tuple Union声明函数重载”,在日常操作中,相信很多人在TypeScript中怎么使用Tuple Union声明函数重载问题上存在疑惑,小编查阅...
    99+
    2023-06-29
  • C++函数重载、隐藏与覆盖重写的方法是什么
    这篇文章主要介绍了C++函数重载、隐藏与覆盖重写的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载、隐藏与覆盖重写的方法是什么文章都会有所收获,下面我们一起来看看吧。1 函数重载定义:C+...
    99+
    2023-06-29
  • Golang函数的函数重载和方法重载的异同比较
    在Golang编程语言中,函数重载和方法重载两个概念都非常重要,它们可以实现对于不同类型参数的重载,以便提高代码的复用性和灵活性。然而,函数重载和方法重载在实现方式和使用场景上也存在着一些异同之处。本文将对这两个概念进行详细的比较。一、概念...
    99+
    2023-05-16
    Golang 方法重载 函数重载
  • Java 重载、重写、构造函数的实例详解
    Java 重载、重写、构造函数的实例详解方法重写重写只能出现在继承关系之中。当一个类继承它的父类方法时,都有机会重写该父类的方法。一个特例是父类的方法被标识为final。重写的主要优点是能够定义某个子类型特有的行为。class Animal...
    99+
    2023-05-31
    java 重载 重写
  • TypeScript中的函数
    目录1.函数定义 1.1JavaScript中的函数 1.2TypeScript中的函数 2.可选参数和默认参数 3.剩余参数 1.函数定义 1.1JavaScript中的函数 ...
    99+
    2022-11-12
  • python函数重载
    python中是不支持函数重载的,但在python3中提供了这么一个装饰器functools.singledispatch,它叫做单分派泛函数,可以通过它来完成python中函数的重载,让同一个函数支持不同的函数类型,它提供的目的也正是为了...
    99+
    2023-01-31
    函数 python
  • Java中方法重写与重载的区别
    目录一、重写(Override)二、重载(Overload)三、总结Java方法重写(Override)与重载(Overload)的区别(超详细) 首页在我们要学习这个知识点之前,应...
    99+
    2022-11-13
  • C++中函数重载详解
    目录函数重载的概念函数重载的应用 为什么C++支持函数重载,而C语言不支持函数重载的概念 函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函...
    99+
    2022-11-13
  • C++函数重载、隐藏与覆盖重写的精通指南
    前言 对于C++函数而言,多个函数如果同名会有很多有意思的事情,从声明的作用域来看,在横向上同一个可访问作用域里面的同名函数可以进行重载;而纵向上作用域对于父子继承的派生类来说,同样...
    99+
    2022-11-13
  • C++中的函数重载问题及解决方法
    C++中的函数重载问题及解决方法引言:函数重载是C++中一种非常强大的特性,它允许在同一个作用域内定义多个同名函数,但函数的参数类型、个数或顺序不同。这样可以根据不同的参数选择不同的函数执行,提高代码的灵活性和可读性。然而,在实际编程过程中...
    99+
    2023-10-22
    C++编程 函数重载问题 函数重载解决方法
  • Java中方法重写和方法重载的6个区别
    一、定义 方法重载(Overloading):在同一个类中,方法名相同但参数类型、参数个数不同的方法之间的关系。 方法重写(Overriding):在子类中,有相同的方法名、参数类型、参数个数并且返回类型兼容的方法称之为...
    99+
    2023-10-29
    方法 重写 区别
  • C++之函数的重载
    目录一、C++ 函数重载1.重载规则2.匹配原则3.重载底层实现4.extern “C”总结一、C++ 函数重载 C++ 致力于简化编程,能过函数重名来达到简化编程的目的 1.重载规...
    99+
    2022-11-12
  • C++重载的奥义之函数重载详解
    目录一、基本定义        二、应用举例        三、非函数重载的情况四、函数重载的使用原则...
    99+
    2023-05-16
    C++ 函数重载 C++ 函数 C++ 重载
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作