【问题标题】:How do I make JSHint complain about missing function parameters?如何让 JSHint 抱怨缺少函数参数?
【发布时间】:2015-10-08 22:37:42
【问题描述】:

如果我有一个函数:

export function createWeeklyStats(activities, offset, length) {
    ...        
}

我把这个函数称为:

createWeeklyStats(myListOfActivities, 0)

JSHint 不会抱怨我缺少 length 参数。我在这里找不到匹配的执行选项:

JSHint Options Reference

存在吗?

我正在更新现有方法以包含一个新的必需参数,虽然我自称是成年人,但如果我最好的出路是全文搜索,我会在这里大吃一惊。

【问题讨论】:

  • 据我所知不存在,可能是因为很难判断参数何时是可选的,何时不是。所以你可以试试……或者按CTRL+SHIFT+F
  • 如果我不希望它们中的任何一个是可选的怎么办?
  • 肯定会大吃一惊。
  • 是的,从强类型语言到非类型语言的过渡有点难度。您不能使用编译器/解析器来告诉您某些类型的编码错误。你需要习惯的是做更多的运行时参数检查,对所有内容进行单元测试,并确保进行端到端的测试来运行所有代码路径。只有这样才能知道您没有意外输入会在运行时杀死代码的输入错误。
  • 当你想要重构/重构一些代码时,我发现它特别痛苦,而且我习惯于让 C++ 编译器告诉我所有更改的引用在哪里。使用 JS,你必须手动找到它们,然后确保你测试所有调用它的东西。一套好的自动化单元测试可以帮助很多。而且,JSHint 确实有帮助 - 它只是无法找到所有内容。

标签: javascript jshint ecmascript-5


【解决方案1】:

评论者是正确的,没有办法要求 js[hl]int 找到这个。

这里有一些选项:

明确检查参数计数

检查参数计数:

function createWeeklyStats(activities, offset, length) {
  assert(arguments.length === 3);

当然,这将在运行时而不是编译时引发错误。

也许你想写一个高阶函数来帮助你:

function check_arg_count(f) {
  return function() {
    assert(arguments.length === f.length);
    return f.apply(this, arguments);
  };
}

现在您不再调用createWeeklyStats,而是调用check_arg_count(createWeeklyStats)

我认为这种方法没有什么特别的问题。处理可选参数会有点棘手。在某些时候,您可能想认输并转向更强类型的语言或 TypeScript。

使用重构工具

在这种情况下,您正在重构,那么使用重构工具怎么样?许多编辑器/IDE 都有这样的功能。查看文档。

还有其他工具可以帮助重构。例如,看看grasp。实际上,掌握教程描述了一个类似的案例,涉及重构函数的参数列表:

$ grasp -r -e 'createWeeklyStats($a, $o)' -R 'createWeeklyStats($a, $o, 0)' })' .

这会将第三个参数添加到所有调用中。更改新的第三个参数显然是您必须照顾自己的事情。掌握提供了其他功能来缩小更改的范围。

自定义 linter

您可以为 eslint 编写自定义规则(但显然不是 jshint;请参阅 this question)。这可以让你开始:https://gist.github.com/jareware/7179093。还有http://eslint.org/docs/developer-guide/working-with-rules.html

【讨论】:

  • TypeScript 是另一种选择。
猜你喜欢
  • 1970-01-01
  • 2020-04-08
  • 2017-04-09
  • 2015-10-31
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2015-03-13
相关资源
最近更新 更多