【问题标题】:Typescript Return Types: explicit-module-boundary-types error打字稿返回类型:显式模块边界类型错误
【发布时间】:2021-06-06 23:47:28
【问题描述】:

我正在尝试从 Node 迁移到 Typescript 进行调整,所以我设置了一堆 eslint 来帮助我:

我似乎无法理解以下 eslint 错误:

函数缺少返回类型。 eslint@typescript-eslint/explicit-module-boundary-types

这是我的代码,错误是在 sns 函数上引发的。

const sns = ({config, logger}: SNSInterface) => {
  const client = new SNSClient({endpoint: config.sns.endpoint});

  const publish = async ({message, topicArn}: PublishInterface) : Promise<void> => {
    const command = new PublishCommand({
      Message: JSON.stringify(message),
      TopicArn: topicArn,
    });
    logger.debug({message, topicArn}, 'Publishing SNS Message');
    const data = await client.send(command).catch((err) => {
      logger.error(err, 'Failed to send Topic ARN');
      throw err;
    });
    logger.debug({data}, 'Publishing SNS Message Results');
  };

  return {
    publish,
  };
};

export default sns;

虽然我可以通过添加来解决它:

interface SNSReturnInterface {
  publish: ({ message, topicArn }: PublishInterface) => Promise<void>;
}

const sns = ({config, logger}: SNSInterface): SNSReturnInterface => {

这真的是最好的方法吗?我认为 Typescript 应该可以推断这一点?如果我想向发布函数添加一个参数,那是否意味着我每次都必须更改 ReturnInterface 定义?除非必要,我不想关闭规则。感谢任何建议!

【问题讨论】:

    标签: typescript typescript-eslint


    【解决方案1】:

    explicit-module-boundary-types 规则意味着您需要明确告诉 Typescript sns 函数返回什么。

    在您的示例中,您已经定义了 publish 的类型,但您没有明确定义 sns (return { publish }) 的返回类型。

    Typescript 本身完全可以推断这些类型,但规则希望您明确,这就是您的第二个示例有效的原因。

    如果您想让 Typescript 自动推断这些返回类型,那么您应该可以关闭该 eslint 规则。

    或者,如果您希望保留规则,但只定义一次类型,您可以像在第二个示例中所做的那样定义返回类型,并从其他地方省略它们。这样,您就可以明确定义边界类型(导出的 sns 对象),Typescript 可以使用它来推断 publish 的类型。

    【讨论】:

    • 太棒了,谢谢!如果我想添加另一个参数来发布 - 比如 targetArn,我是否需要将它添加到两者:``` interface SNSReturnInterface { publish: ({ message, topicArn, targetArn }: PublishInterface) => Promise; } ``` 以及函数定义? ``` const publish = async ({message, topicArn, targetArn}: PublishInterface) => ``` 或者有没有办法可以省略 ReturnInterface 的参数?
    • 通过您给出的示例,您应该能够在ReturnInterface 中将publish 的定义指定为(publishParams: PublishInterface) =&gt; Promise&lt;void&gt;,这样您就不必重新指定PublishInterface在很多地方。即,如果您已经指定它的类型为PublishInterface,则无需在类型定义中解开发布函数的参数
    • 嗯,好的,谢谢!还在适应打字稿生活! :D
    猜你喜欢
    • 2020-06-29
    • 2021-09-18
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2017-05-20
    • 1970-01-01
    • 2018-12-17
    相关资源
    最近更新 更多