在 TypeScript 中,函数重载(Function Overload) 是指为同一个函数提供多个不同的调用签名(参数类型和返回值类型的组合),但函数体只有一个实现。这样可以让函数在不同的输入下表现出不同的行为,同时保持类型安全。

一、函数重载的基本概念

1. 重载签名(Overload Signatures)

声明函数可以接受的不同参数类型和返回值类型,但不包含函数体。

2. 实现签名(Implementation Signature)

实际的函数实现,参数类型必须兼容所有重载签名,返回值类型也需符合重载签名的约束。

二、示例:函数重载的使用

1. 基础重载示例

typescript

// 重载签名 1:接受数字,返回数字的平方
function calculate(x: number): number;// 重载签名 2:接受字符串,返回字符串的长度
function calculate(x: string): number;// 实现签名:兼容所有重载签名
function calculate(x: number | string): number {if (typeof x === 'number') {return x * x; // 处理数字} else {return x.length; // 处理字符串}
}// 使用示例
const result1 = calculate(5);     // 返回 25(数字)
const result2 = calculate("abc"); // 返回 3(字符串长度)
// const result3 = calculate(true); // 错误:不匹配任何重载签名
2. 多个参数的重载

typescript

// 重载签名 1:合并两个字符串
function merge(a: string, b: string): string;// 重载签名 2:合并两个数组
function merge(a: number[], b: number[]): number[];// 实现签名
function merge(a: string | number[], b: string | number[]): string | number[] {if (typeof a === 'string' && typeof b === 'string') {return a + b; // 字符串拼接} else if (Array.isArray(a) && Array.isArray(b)) {return [...a, ...b]; // 数组合并}throw new Error("Invalid arguments");
}// 使用示例
const mergedStr = merge("Hello", "World"); // 返回 "HelloWorld"
const mergedArr = merge([1, 2], [3, 4]);    // 返回 [1, 2, 3, 4]

三、函数重载的注意事项

  1. 重载签名与实现签名的关系

    • 实现签名的参数类型必须是所有重载签名参数类型的超集
    • 实现签名的返回值类型必须能赋值给所有重载签名的返回值类型。

    typescript

    // 错误示例:实现签名的参数类型不兼容重载签名
    function add(a: number, b: number): number;
    function add(a: string, b: string): string;
    function add(a: number | string, b: number): number | string { // 错误:第二个参数必须兼容 stringreturn a + b;
    }
    
  2. 重载解析规则

    • TypeScript 会从上到下匹配第一个符合参数类型的重载签名。
    • 因此,重载签名的顺序很重要,通常应将更具体的签名放在前面。

    typescript

    function fn(x: string): string;
    function fn(x: any): any;
    function fn(x: any): any { return x; }fn("hello"); // 匹配第一个重载(更具体)
    fn(123);     // 匹配第二个重载
    

四、替代方案:联合类型与泛型

对于简单的函数重载场景,可以使用联合类型或泛型替代,使代码更简洁:

1. 联合类型

typescript

function calculate(x: number | string): number {if (typeof x === 'number') {return x * x;} else {return x.length;}
}
2. 泛型

typescript

function identity<T>(arg: T): T {return arg;
}

五、函数重载的应用场景

  1. 根据参数类型返回不同类型

    typescript

    function parseJSON(json: string): any;
    function parseJSON(json: null): null;
    function parseJSON(json: string | null): any | null {return json ? JSON.parse(json) : null;
    }
    
  2. 可选参数的不同组合

    typescript

    function createElement(tag: string): HTMLElement;
    function createElement(tag: string, className: string): HTMLElement;
    function createElement(tag: string, className?: string): HTMLElement {const el = document.createElement(tag);if (className) el.className = className;return el;
    }
    

总结

特性说明
定义方式先声明多个重载签名,再实现一个兼容所有签名的函数体。
类型检查调用时必须匹配某个重载签名,实现签名内部需自行处理类型逻辑。
适用场景函数需要根据不同参数类型返回不同类型,或处理多种参数组合。
替代方案简单场景可使用联合类型或泛型,但函数重载能提供更精确的类型控制。

函数重载是 TypeScript 增强函数类型表达力的重要工具,合理使用可以让代码既安全又灵活。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85664.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85664.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/85664.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

磐基PaaS平台MongoDB组件SSPL许可证风险与合规性分析(上)

#作者&#xff1a;任少近 文章目录 1.背景与问题1.1.背景1.2.问题 3.SSPL条款解读分析3.1.条款0&#xff1a;定义条款3.2.条款一&#xff1a;源代码条款3.3.条款二&#xff1a;基本授权条款3.4.条款三&#xff1a;反规避保护条款3.5.条款四&#xff1a;逐字传播条款3.6.条款五…

「Linux文件及目录管理」输入输出重定向与管道

知识点解析 输入/输出重定向 标准输入(stdin):默认从键盘读取,文件描述符为0。标准输出(stdout):默认输出到终端,文件描述符为1。标准错误(stderr):默认输出到终端,文件描述符为2。重定向符号: >:覆盖输出到文件(如command > file)。>>:追加输出…

【Node】最佳Node.js后端开发模板推荐

Node.js 后端开发模板推荐 以下是几个优秀的Node.js后端模板&#xff0c;它们都适合二次开发&#xff0c;各自有不同的特点和适用场景&#xff1a; 1. Express基础模板 Express Generator (官方工具) 官方提供的快速搭建工具基础MVC结构简单易上手 npm install express-ge…

HALCON相机标定

相机标定简介&#xff1a; 首先&#xff0c;相机会产生畸变&#xff0c;即实际图像和拍摄图像不一致&#xff0c;可以是凸性也可以是凹性形变&#xff0c;相机标定的过程就是将畸变图像还原为原始图像&#xff0c;并将图像中的像素坐标转换为世界坐标。 形如&#xff1a;相机内…

Solidity 入门教程(二):值类型全解 —— 布尔、整数、地址与字节数组

在上一章中&#xff0c;我们写下了第一个 Solidity 合约并在 Remix 中成功运行。本章我们将深入了解 Solidity 中的几种常用值类型&#xff08;Value Types&#xff09;&#xff0c;并通过示例代码在 Remix 进行验证。 一、Solidity 中的三种数据类型 在 Solidity 中&#xf…

16.大数据监控

0.说明 监控主要构成。 软件版本。 1.exporter监控配置 1.1 node_exporter 启动命令 nohup ./node_exporter &服务 创建文件 /etc/systemd/system/node_exporter.service&#xff1a; [Unit] DescriptionPrometheus Node Exporter Wantsnetwork-online.target Aft…

Tomcat项目本地部署(Servlet为例)

在Windows上部署 在idea中打开项目 首先我们需要准备一个Servlet项目&#xff0c;我之前的Servlet项目是用eclipse写的&#xff0c;这种情况下如果用idea直接打开的话会出现左侧目录无法显示的情况&#xff0c;这个时候我们就需要用别的方法打开 打开项目管理 如下图&#…

安装MySQL 5.7导入数据,修改密码,创建账号并授权

1. 准备工作 sudo yum update -y sudo yum install -y wget libaio numactl 2. 下载 MySQL 5.7 二进制包 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.44-linux-glibc2.12-x86_64.tar.gz 3. 创建 MySQL 用户和组 sudo groupadd mysql sudo useradd -r -g m…

基础RAG实现,最佳入门选择(八)

RAG重排序 RAG重排序技术以提高RAG系统中的检索质量。重新排序充当初始检索后的第二个过滤步骤&#xff0c;以确保最相关的内容用于响应生成。 重排序的关键概念 1.初始检索&#xff1a;使用基本相似度搜索的第一遍&#xff08;准确度较低但速度更快&#xff09; 2.文档评分…

Spring Boot 常用注解整理

Spring & Spring Boot 常用注解整理 现代的 Spring 与 Spring Boot 应用大量使用注解来简化配置、管理组件和实现各种框架功能。本文系统整理了常用的 Spring/Spring Boot 注解&#xff0c;按照功能分类进行介绍。每个注解都会涵盖其含义、提供来源、应用场景以及代码示例…

深入理解 Cross-Entropy 损失函数:从原理到实践

在深度学习中&#xff0c;损失函数是衡量模型性能的关键指标之一。对于多分类问题&#xff0c;Cross-Entropy 损失函数 是最常用的选择之一。它不仅能够有效衡量模型输出与真实标签之间的差异&#xff0c;还能通过梯度下降法指导模型的优化。本文将深入探讨 Cross-Entropy 损失…

Vim-vimrc保存文件自动移除行末尾空格

Vim-vimrc保存文件自动移除行末尾空格 这段代码通过设置 autocmd 和自定义函数&#xff0c;确保每次保存文件时都自动删除文件中的行尾空格&#xff0c;同时不会影响光标和视图的位置。它适用于所有文件类型&#xff0c;并且删除操作不会引入错误&#xff0c;即使没有行尾空格的…

Occt几何内核快速入门

本文简单介绍 Open Cascade Technology&#xff08;OCCT&#xff09;&#xff0c;提供了下载地址和文档地址。通过OCCT的测试工具Draw&#xff0c;展示了OCCT的一些功能特性。介绍了OCCT集成开发的演示代码&#xff0c;提供了源代码下载地址和编译过程文件。 一、简介 Open C…

【Docker 08】Compose - 容器编排

&#x1f308; 一、Docker Compose 介绍 ⭐ 1. Docker Compose 是什么 Docker Compose 是由 Docker 官方提供的一个用于定义和运行多容器应用的工具&#xff0c;它让用户可以通过一个 YAML 文件&#xff08;通常是 docker-compose.yml&#xff09;来配置应用所需要的服务&…

CentOS Stream 9平台部署安装MySQL8.4.1

1、在线下载安装包 [rootlocalhost ~]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.4.1-1.el9.x86_64.rpm-bundle.tar 2、新建解压文件夹 [rootlocalhost ~]#mkdir /root/sql 3、离线解压安装包安装配置MySQL8 上传安装包到home下 [rootlocalhost ~]#c…

phpstorm无缝切换vscode

要将 PhpStorm 的开发体验无缝迁移到 VS Code&#xff0c;需重点配置插件、快捷键和操作习惯。以下是详细方案&#xff1a; 一、必备插件清单 安装以下插件&#xff08;VS Code 搜索安装&#xff09;&#xff1a; PHP Intelephense&#xff1a;核心插件&#xff08;代码补全、…

雨声_锦程_时年

1 炎凉 飘零于三界。 子铭师傅看了几卷笔记&#xff0c;以为我文笔很好&#xff0c;于是我留在石铭公社。 我每日在公社会议厅&#xff0c;高地吹风&#xff0c;悠然笔记。 我喜欢四处旅行。 穿着鞘翅飞翔&#xff0c;风划过耳边。 我渴求所饮的每一滴水&#xff0c;追忆木履留…

微信小程序使用rsa 加解密

jsencrypt.min.js !function(t,e){"object"typeof exports&&"undefined"!typeof module?e(exports):"function"typeof define&&define.amd?define(["exports"],e):e(t.JSEncrypt{})}(this,function(t){"use s…

2025北邮软件工程复习

文章目录 废话知识点总结Part1 软件工程概述Part2 软件需求分析需求介绍需求描述方法 Part3 软件设计方法软件设计的概念与原则软件设计的方法 Part4 程序实现方法Part5 软件测试方法白盒测试黑盒测试 练习题北邮2021~2022期末考北邮2018期末考 考后总结 废话 update on 4.24&…

《Whisper模型版本及下载链接》

Whisper模型版本及下载链接 Whisper是OpenAI开发的语音识别模型&#xff0c;以下按模型规模从小到大排列&#xff0c;包含不同语言版本及通用版本&#xff1a; 1. Tiny系列&#xff08;轻量级&#xff09; tiny.en.pt&#xff08;英文专用&#xff09;&#xff1a; https://…