📚 重载基础
函数重载允许为同一个函数提供多个类型签名,根据输入参数的不同返回不同类型的结果。
// 重载签名
function reverse(str: string): string;
function reverse<T>(arr: T[]): T[];
// 实现(必须兼容所有重载)
function reverse<T>(input: string | T[]): string | T[] {
if (typeof input === 'string') {
return input.split('').reverse().join('');
}
return input.slice().reverse();
}
// 使用
const reversedStr = reverse('hello'); // "olleh" (string)
const reversedArr = reverse([1, 2, 3]); // [3, 2, 1] (number[])
💻 实际示例
// DOM 元素查询
function query(selector: string): Element | null;
function query(selector: string, all: true): NodeListOf<Element>;
function query(selector: string, all?: boolean): Element | NodeListOf<Element> | null {
if (all) {
return document.querySelectorAll(selector);
}
return document.querySelector(selector);
}
// 事件处理
function on(element: HTMLElement, event: string, handler: EventListener): void;
function on(element: HTMLElement, events: string[], handler: EventListener): void;
function on(element: HTMLElement, eventOrEvents: string | string[], handler: EventListener): void {
if (Array.isArray(eventOrEvents)) {
eventOrEvents.forEach(event => element.addEventListener(event, handler));
} else {
element.addEventListener(eventOrEvents, handler);
}
}
⚠️ 注意事项
// 重载签名顺序很重要:从具体到宽泛
function process(x: string): string;
function process(x: number): number;
function process(x: string | number): string | number {
if (typeof x === 'string') {
return x.toUpperCase();
}
return x * 2;
}
// 实现签名对外不可见
// function process(x: string | number): string | number { ... }
// 用户只能使用重载签名调用
⚠️
重载陷阱
实现签名必须兼容所有重载签名。用户只能通过重载签名调用函数,实现签名对外不可见。