首页 > 解决方案 > 如何在打字稿中将两个参数传递给函数或不传递?

问题描述

我想改进一个只返回状态的函数。除了记录器和使用它记录的消息之外,它不接受任何其他参数。

export function status(logger: Logger, reason: string) {
  logger.info(reason);
  return {
    result: 'ok'
  };
}

但是我想让参数可选,所以如果我不想记录任何东西,我不需要传递任何东西。因此,我将其更改为:

export function status(logger?: Logger, reason?: string) {
  reason && logger?.info(reason);
  return {
    result: 'ok'
  };
}

但是我仍然可以提供记录器,但不能提供原因,我不喜欢这样。我希望这个函数接受两个参数或不接受参数。所以我尝试了这样的事情:

export function status(param: {logger: Logger, reason: string} | {} = {}) {
  param?.logger.info(reason);
  return {
    result: 'ok'
  };
}

但是现在我得到了TS2339: Property 'logger' does not exist on type '{} | { logger: Logger; reason: string; }'.   Property 'logger' does not exist on type '{}'.,我不知道如何正确地做到这一点。我想学习 - 你能解释一下如何做到这一点吗?

标签: typescriptparametersparameter-passing

解决方案


编辑:您没有提供 Logger 类型的外观。但是看到您的代码,我认为它必须与此类似:

type Logger = { info: (someInfo: string) => void }

定义状态函数接收的参数类型:

type paramsStatus = {
  logger: { info: (someInfo: string) => void },
  reason: string,
}

你用 ? 操作员。由于 logger 和 reason 是必需的(参见上面的类型),它们都必须传递给 status 函数。两者都对,或者都不对,这两种方式都是正确的。

export function status(params?: paramsStatus) {
  params && params.logger.info(params.reason); //If params exist, then log the info
  return {
    result: 'ok',
  };
}

推荐阅读