iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >TypeScript 使用 Tuple Union 声明函数重载
  • 799
分享到

TypeScript 使用 Tuple Union 声明函数重载

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

问题: typescript 中为函数添加多个签名后,依然需要添加相应的代码来判断并从不同的签名参数列表中获取对应的参数。过去常见的写法: function refEventEmit

问题:

typescript 中为函数添加多个签名后,依然需要添加相应的代码来判断并从不同的签名参数列表中获取对应的参数。过去常见的写法:

function refEventEmitter(event?: string): void;
function refEventEmitter(event: string, callback: () => void): void;
function refEventEmitter(callback: () => void): void;
function refEventEmitter(
  eventOrCallback?: string | (() => void),
  callback?: () => void,
): void {
  let event: string | undefined;

  if (typeof eventOrCallback === 'function') {
    callback = eventOrCallback;
  } else {
    event = eventOrCallback;
  }

  // ...
}

这个过程因为将原有参数列表直接按序号拍平,参数之间的类型关联需要人肉确保正确。

技巧:

这时我们可以通过使用tuple uNIOn 的参数类型,来无脑处理各种函数重载情况:

function refEventEmitter(event?: string): void;
function refEventEmitter(event: string, callback: () => void): void;
function refEventEmitter(callback: () => void): void;
function refEventEmitter(
  ...args:
    | [event?: string]
    | [
        event: string,
        callback: () => unknown,
      ]
    | [callback: () => unknown]
): void {
  let [event, callback] =
    args.length === 2
      ? args
      : typeof args[0] === 'function'
      ? [undefined, args[0]]
      : [args[0], undefined];

  // ...
}

实际上,此时上方的签名列表也不再需要了:

function refEventEmitter(
  ...args:
    | [event?: string]
    | [
        event: string,
        callback: () => unknown,
      ]
    | [callback: () => unknown]
): void {
  let [event, callback] =
    args.length === 2
      ? args
      : typeof args[0] === 'function'
      ? [undefined, args[0]]
      : [args[0], undefined];

  // ...
}
这篇其实拖了有点久,在写的时候发现 TypeScript 已经内置了 "Convert overload list to single signature" 的重构选项,可以一键将重载列表变为参数 tuple union。

不过到这里其实还存在问题,TypeScript 中 typeof 条件判断不能对整个对象进行收窄,只能收窄被 typeof 到的某个元素、属性。上面的例子中,如果需要的不只是 args[0] 就会出现问题。

此时我们可以引入一个工具函数 isTypeOfProperty(object, key, type):

此时实现就变成了:

function refEventEmitter(
  ...args:
    | [event?: string]
    | [
        event: string,
        callback: () => unknown,
      ]
    | [callback: () => unknown]
): void {
  let [event, callback] =
    args.length === 2
      ? args
      : isTypeOfProperty(args, 0, 'function')
      ? [undefined, args[0]]
      : [args[0], undefined];

  // ...
}

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

--结束END--

本文标题: TypeScript 使用 Tuple Union 声明函数重载

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

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

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

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

下载Word文档
猜你喜欢
  • TypeScript 使用 Tuple Union 声明函数重载
    问题: TypeScript 中为函数添加多个签名后,依然需要添加相应的代码来判断并从不同的签名参数列表中获取对应的参数。过去常见的写法: function refEventEmit...
    99+
    2024-04-02
  • TypeScript中怎么使用Tuple Union声明函数重载
    这篇文章主要介绍“TypeScript中怎么使用Tuple Union声明函数重载”,在日常操作中,相信很多人在TypeScript中怎么使用Tuple Union声明函数重载问题上存在疑惑,小编查阅...
    99+
    2023-06-29
  • 如何在PHP8中使用Union Types更好地声明函数返回值类型?
    如何在PHP8中使用Union Types更好地声明函数返回值类型?在PHP8发布之前,函数的返回值类型声明是通过使用return关键字后面跟着类型名称来完成的。但是在PHP8中,我们可以使用更强大的Union Type...
    99+
    2023-10-22
    PHP Union types 函数返回值类型声明
  • C++ 重载函数的声明:理解函数签名重用的原理
    重载函数允许在同一作用域内创建具有相同名称但不同参数列表的多个函数,从而实现代码重用和灵活性:函数签名包含函数名称和参数列表,用于唯一标识函数。参数列表可以包含基本数据类型、类类型、引用...
    99+
    2024-05-02
    c++ 重载函数 作用域
  • TypeScript 泛型重载函数的使用方式
    目录前言TypeScript 的运行环境1. ts-node2. tscTypeScript 中的函数重载简单的排序算法1. 快速排序2. 中文排序3. 字符串自排序4. 通过泛型整...
    99+
    2022-11-13
    TypeScript 泛型重载函数使用方式 TypeScript 泛型重载函数
  • 详解PHP中函数声明与使用方法
    PHP是一种强大的、开源的服务器端脚本语言,广泛用于Web开发。其中,函数(function)是PHP中最重要的组成部分之一。函数是一段可重复使用的代码块,用于执行特定的任务。本文将介绍PHP中函数的使用方法。声明函数声明函数是指定义函数名...
    99+
    2023-05-14
    php php函数
  • C++ 中如何声明和使用友元函数?
    c++++ 中的友元函数是一种可访问其他类私有/受保护成员的特殊函数。声明友元函数时需使用 friend 关键字,如:声明友元函数:friend void printvalue(cons...
    99+
    2024-04-12
    c++ 友元函数 封装性
  • 使用Kotlin怎么定义函数与声明变量
    使用Kotlin怎么定义函数与声明变量?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Kotlin基础教程之函数定义与变量声明可以看到,函数定义就是 <访问控制符> ...
    99+
    2023-05-31
    kotlin 声明变量 函数定义
  • GO语言函数(func)的声明与使用详解
    GO语言函数介绍 GO是编译性语言,所以函数的顺序是无关紧要的,为了方便阅读,建议入口函数main写在最前面,其余函数按照功能需要进行排列 GO的函数不支持嵌套,重载和默认参数GO的...
    99+
    2022-12-20
    GO语言函数声明与使用 GO语言递归函数 GO语言内置函数 GO语言函数defer应用 GO语言函数可变长度参数
  • python如何在函数声明中使用默认值
    小编给大家分享一下python如何在函数声明中使用默认值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在函数声明中使用默认值在几乎所有的Python项目中,大多数...
    99+
    2023-06-27
  • Python使用什么关键字声明匿名函数
    在Python中一般使用lambda对匿名函数进行声明,具体方法如下:lambda语法:lambda x:x*x #lambda关键字表示匿名函数,冒号前边x表示传递的参数,后边是返回的结果。lambda使用方法:li = [1,2,3]n...
    99+
    2024-04-02
  • 如何使用函数式思维重构TypeScript 代码
    这篇文章给大家介绍如何使用函数式思维重构TypeScript 代码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。谈到函数式编程时,我们常提到机制、方法,而不是核心原则。函数式编程不是关...
    99+
    2024-04-02
  • PHP中函数声明与使用的方法是什么
    今天小编给大家分享一下PHP中函数声明与使用的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。声明函数声明函数是指定...
    99+
    2023-07-05
  • C++简明讲解缺省参数与函数重载的用法
    目录一、缺省参数1.1缺省参数概念1.2缺省参数分类二、函数重载2.1函数重载概念2.2名字修饰一、缺省参数 缺省参数形象来说就是"备胎"。 1.1缺省参数概念 ...
    99+
    2024-04-02
  • 怎么使用C++函数类型与重载函数
    本篇内容介绍了“怎么使用C++函数类型与重载函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.首先对重载函数,明确函数的返回类型不能决定...
    99+
    2023-06-25
  • C++函数重载怎么定义使用
    这篇文章主要介绍了C++函数重载怎么定义使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++函数重载怎么定义使用文章都会有所收获,下面我们一起来看看吧。一、函数重载分析(上)1.1 重载的定义定义:同一个标...
    99+
    2023-06-30
  • C++ 函数重载如何与虚函数结合使用?
    函数重载和虚函数可以结合使用,允许子类在不修改父类行为的情况下,以不同方式实现相同操作的不同方面。通过在父类中声明虚函数,并在子类中重载它们,我们可以实现动态多态,允许通过父类引用调用不...
    99+
    2024-04-13
    c++ 函数重载 虚函数
  • C++ 函数重载和重写的理解和使用
    c++++ 中函数重载允许在同一类中定义同名函数,但参数列表不同;函数重写发生在子类中定义一个与父类同名且参数相同的函数,子类函数将覆盖父类函数。实战示例中,重载函数用于针对不同数据类型...
    99+
    2024-04-20
    函数重载 函数重写 c++
  • C++简明分析讲解引用与函数提高及重载
    目录详解引用引用的基本使用引用做函数参数引用做函数返回值常量引用引用的本质函数提高函数默认值函数占位参数函数重载及注意事项详解引用 引用的基本使用 语法:数据类型 &新变量名...
    99+
    2024-04-02
  • C++ 函数声明中的 lambda 表达式:探索匿名函数的灵活使用
    lambda 表达式是一种匿名函数,可在函数声明中创建并传递函数对象,提高代码灵活性和可读性。其语法为:[捕获列表] (参数列表) -> 返回类型 { 函数体 }。在实际应用中,它...
    99+
    2024-05-03
    c++ lambda
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作