我想定义一个函数,该函数提供两种调用方式:
function visit(url: string, options: Partial<VisitOptions>): void
function visit(options: Partial<VisitOptions> & {url:string}): void
我不确定实现它的最佳方法是什么。
当前我的代码是:
type VisitOptions = {
timeout: number
}
function visit(url: string, options: Partial<VisitOptions>): void;
function visit(options: Partial<VisitOptions> & { url: string }): void;
function visit(...params: any): void {
let finalOptions: Partial<VisitOptions> & { url: string };
if (params.length === 1) {
finalOptions = params[0];
} else {
const [url, options] = params;
finalOptions = {
url,
...options
}
}
console.log(finalOptions);
// ... more
}
您可以在实际的实现功能中看到:
function visit(...params: any): void
我使用...params: any
作为参数,它可以正常工作,但是当我在函数体中使用它时,我会失去安全的输入。
还有更好的方法吗?
答案 0 :(得分:1)
最简单的解决方案是使用元组的联合。然后,您就可以使用length
来区分元组了。基本上所有类型都可以按您期望的方式工作,并且所有类型都是安全的:
type VisitOptions = {
timeout: number
}
function visit(url: string, options: Partial<VisitOptions>): void;
function visit(options: Partial<VisitOptions> & { url: string }): void;
function visit(...params: [Partial<VisitOptions> & { url: string }] | [string, Partial<VisitOptions>]): void {
let finalOptions: Partial<VisitOptions> & { url: string };
if (params.length === 1) {
finalOptions = params[0];
} else {
const [url, options] = params;
finalOptions = {
url,
...options
}
}
console.log(finalOptions);
// ... more
}