【问题标题】:tslint / typescript: Prevent function nestingtslint / typescript:防止函数嵌套
【发布时间】:2019-12-14 09:15:23
【问题描述】:

有没有办法使用 tslint 来防止函数嵌套?

export const function DontBeLateDate =
  (isDifferent: boolean) =>
    (additionalMilliseconds: Number) =>
      new Date((isDifferent ? 13378335 : 83351337) + additionalMilliseconds);

导致:

DontBeLateDate(true)(1024);

问题 isDifferent is 在嵌套函数中使用。

这应该是有效的:

export const function DontBeLateDate =
  (isSomethingElse: boolean) => {
    if (isSomethingElse) {
      return (isDifferent: boolean, additionalMilliseconds: Number) =>
              new Date((isDifferent ? 5 : 7) +
              additionalMilliseconds);
    }
    return (isDifferent: boolean, additionalMilliseconds: Number) =>
      new Date((isDifferent ? 13378335 : 83351337) +
          additionalMilliseconds);
  }

isSomethingElse 作用域不会渗入内部函数。

【问题讨论】:

  • 不清楚你想让 tslint 在这里警告什么 - 柯里化函数(即像 f(x)(y) 这样调用的函数),或创建闭包(即外部函数的局部变量仍然可用外部函数返回后到内部函数)?两者通常都不会被认为是错误或糟糕的风格。
  • 好点。咖喱函数!这就是我要找的关键字。但关闭是根本问题。后者。
  • 看起来在 GitHub 上有一个第三方项目,尽管根据自述文件它是一个正在进行的工作。 github.com/bafolts/tslint-no-closures
  • 所以我们得到了'function(a)(b)(c)'语法。 '常量 f = 函数 (a); r = f(b); n = f(c); return n;' 会更干净。但更接近的问题对我来说是个问题。适当的类满足柯里化函数。但是,在 javascript 中,我对 curried 函数没有任何问题。
  • 完美。请张贴作为答案!

标签: typescript tslint


【解决方案1】:

这里有两个问题:第一个是currying,即有一个返回函数的函数,这样就可以像f(x)(y)一样调用它。第二个问题是创建closure,即外部函数具有局部变量,即使在外部函数返回后,内部函数仍然可以访问这些变量。

在您所说的 cmets 中,您希望 tslint 警告闭包。这可以使用名为 tslint-no-closures 的第三方 tslint 规则来实现,该规则可在 GitHub 上获得。但是,请注意,该项目的 README 目前表示它正在进行中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 2020-08-29
    • 2013-01-12
    • 2019-05-06
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多