如何在打字稿中为接受1个参数或2个参数的函数定义参数名称和类型?

时间:2019-05-21 07:14:24

标签: typescript typescript-typings

我想定义一个函数,该函数提供两种调用方式:

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作为参数,它可以正常工作,但是当我在函数体中使用它时,我会失去安全的输入。

还有更好的方法吗?

1 个答案:

答案 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
}