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. 使用要点
签名顺序:从最具体 → 最宽泛排列
实现签名:必须兼容所有重载签名
类型收窄:在实现中使用类型守卫区分逻辑
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. 典型应用场景
DOM操作:处理不同元素类型
数学计算:处理数值/矩阵等不同输入
API客户端:处理不同请求参数格式
数据转换:输入输出类型映射
总结:
TypeScript函数重载通过声明多个类型签名+单一实现的方式,在保持JavaScript灵活性的同时提供强类型约束。核心价值在于:
增强API自描述性
精确控制参数-返回值类型映射
提升复杂函数调用的类型安全性
适用于需要处理多种参数模式但实现逻辑统一的场景,是构建类型安全复杂API的关键技术。