function loadImage(url: string): Promise<HTMLImageElement>;
function loadImage(options: { url: string; width: number; height: number }): Promise<HTMLImageElement>;
function loadImage(url: string, callback: (image: HTMLImageElement) => void): void;
function loadImage(arg1: string | { url: string; width: number; height: number }, arg2?: (image: HTMLImageElement) => void): Promise<HTMLImageElement> | void {
if (typeof arg1 === 'string') {
if (typeof arg2 === 'function') {
const img = new Image();
img.onload = () => arg2(img);
img.src = arg1;
} else {
return new Promise((resolve, reject) => {
const img = new Image();
img.onload = () => resolve(img);
img.onerror = reject;
img.src = arg1;
});
}
} else {
return new Promise((resolve, reject) => {
const img = new Image();
img.width = arg1.width;
img.height = arg1.height;
img.onload = () => resolve(img);
img.onerror = reject;
img.src = arg1.url;
});
}
}
这样做的好处
- 代码可读性增强:通过函数重载,清晰地定义了不同参数组合下函数的行为,其他开发者能够直观地了解该函数的使用方式,即使不深入阅读函数实现,也能知道在传入不同类型参数时函数应该如何工作。
- 类型安全:TypeScript会在编译时根据传入的参数类型检查调用是否正确,比如传入错误类型参数或者参数个数不对时,编译器会报错,减少运行时错误。
- 灵活性:支持多种调用方式,满足不同场景的需求,如简单加载图片、加载并指定尺寸图片、加载并在完成后执行回调等,而无需为每种场景定义不同的函数,保持代码简洁。