typescript - 如何在打字稿中将两个参数传递给函数或不传递?
问题描述
我想改进一个只返回状态的函数。除了记录器和使用它记录的消息之外,它不接受任何其他参数。
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 '{}'.
,我不知道如何正确地做到这一点。我想学习 - 你能解释一下如何做到这一点吗?
解决方案
编辑:您没有提供 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',
};
}
推荐阅读
- python - 用于匹配电子邮件地址的自定义正则表达式模式
- elastic-stack - Logstash 7.10.2 Windows x64 - 如何在其中添加记忆插件
- c++ - C++ 正则表达式失败,而在线检查器工作
- python - PyQt5中如何过滤SQLite3表
- reactjs - React Native UseEffect 钩子返回函数永远不会被调用
- amazon-web-services - aws lambda + SQS - 以并发为一体的批量消息传递
- angular - 如何在 module.ts 上进行验证
- c++ - C++中一个对象的继承和构造
- java - 添加多个实体时重复键违规
- json - 如何根据条件 terraform 过滤来自本地人的数据?