当前位置: 首页 > news >正文

TypeScript:重载函数

1. API定义

重载函数通过多个函数签名和一个实现签名定义:

// 重载签名(Overload Signatures)
function greet(name: string): string;
function greet(names: string[]): string[];// 实现签名(Implementation Signature)
function greet(input: string | string[]): string | string[] {if (typeof input === "string") {return `Hello, ${input}!`;} else {return input.map(name => `Hi, ${name}!`);}
}// 调用
const single = greet("Alice"); // string
const multi = greet(["Bob", "Charlie"]); // string[]

2. 核心作用

  • 类型精确匹配:为不同参数组合提供精确返回值类型

  • API文档化:显式声明函数支持的所有调用方式

  • 类型安全:防止参数类型误用和返回值类型错误

3. 主要用处

1.参数多态:处理不同参数类型/数量的场景

// 日期格式化重载
function formatDate(timestamp: number): string;
function formatDate(date: Date): string;
function formatDate(dateObj: Date | number): string {// 实现...
}

2.参数依赖关系:根据参数类型确定返回值类型

// 返回值类型依赖参数类型
function parseInput(input: string): number;
function parseInput(input: number): string;
function parseInput(input: any): any {// 实现...
}

3.可选参数约束:精确控制可选参数组合

// 精确控制可选参数
function createElement(tag: "img", attrs: { src: string }): HTMLImageElement;
function createElement(tag: "a", attrs: { href: string }): HTMLAnchorElement;
function createElement(tag: any, attrs: any): HTMLElement {// 实现...
}

4. 使用要点

  1. 签名顺序:从最具体 → 最宽泛排列

  2. 实现签名:必须兼容所有重载签名

  3. 类型收窄:在实现中使用类型守卫区分逻辑

function process(data: string): void;
function process(data: string[]): void;
function process(data: any): void {if (typeof data === "string") {// 字符串处理} else if (Array.isArray(data)) {// 数组处理}
}

避免陷阱

  • ❌ 实现签名不可直接调用

  • ✅ 至少需要两个重载签名

  • ✅ 返回值类型必须兼容所有签名

5. 最佳实践总结

场景推荐方案示例
参数类型不同重载签名(input: string)→A; (input: number)→B
参数数量不同可选参数+重载(a:number); (a:number, b:number)
复杂参数组合联合类型+类型守卫配合typeof/instanceof检查
简单多态泛型函数<T>(arg: T): T

6. 典型应用场景

  1. DOM操作:处理不同元素类型

  2. 数学计算:处理数值/矩阵等不同输入

  3. API客户端:处理不同请求参数格式

  4. 数据转换:输入输出类型映射

总结

        TypeScript函数重载通过声明多个类型签名+单一实现的方式,在保持JavaScript灵活性的同时提供强类型约束。核心价值在于:

  • 增强API自描述性

  • 精确控制参数-返回值类型映射

  • 提升复杂函数调用的类型安全性
    适用于需要处理多种参数模式但实现逻辑统一的场景,是构建类型安全复杂API的关键技术。

http://www.dtcms.com/a/354403.html

相关文章:

  • 《Linux 网络编程四:TCP 并发服务器:构建模式、原理及关键技术(select )》
  • oceanbase-部署
  • yolo ultralytics之yolov8.yaml文件简介
  • 《信息检索与论文写作》实验报告三 中文期刊文献检索
  • Linux 云服务器内存不足如何优化
  • LinuxC系统多线程程序设计
  • C语言:数据在内存中的存储
  • nginx referer-policy 和 referer
  • redis集群分片策略
  • 【温室气体数据集】NOAA CCGG 飞机观测温室气体
  • 2025年06月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • spring-cloud项目中gateway配置解析
  • DMA学习
  • 【0420】Postgres内核 smgr + md + vfd 实现为指定 table(CREATE TABLE)创建 disk file
  • 每日八股文8.27
  • Linux系统调优工具
  • [Sync_ai_vid] 数据处理流水线 | 配置管理系统
  • 【重学 MySQL】九十二、 MySQL8 密码强度评估与配置指南
  • mysql mvcc机制详解
  • 期权交易中的“道”:从《道德经》中汲取投资智慧
  • RHEL9部署MySQL数据库及数据库的基本使用(增删改查,数据备份恢复)
  • 基于SpringBoot的社区儿童疫苗接种预约系统设计与实现(代码+数据库+LW)
  • Vue将内容生成为二维码,并将所有二维码下载为图片,同时支持批量下载(下载为ZIP),含解决一次性生成过多时页面崩溃解决办法
  • 【雅思020】Opening a bank account
  • C语言二级考试环境配置教程【window篇】
  • 能源行业数据库远程运维安全合规实践:Web化平台的落地经验
  • 【系统分析师】高分论文:论快速应用开发方法及应用
  • Linux初始——基础指令篇
  • Libvio 访问异常排查指南​
  • List | 常见的List实现类(ArrayList、LinkedList、Vector)以及ArrayList源码解读