TypeScript中是否有一个选项,以便编译的JavaScript文件与JSHint兼容?

时间:2016-08-22 10:48:40

标签: javascript typescript jshint

考虑以下TypeScript代码示例。

var checkEqual = function (a:any, b:any) {
    if(a == null)
    {
        return false;
    }
}

当我编译它时,它将生成相应的JavaScript文件而没有任何编译时错误,如下所示:

var checkEqual = function (a, b) {
    if (a == null) {
        return false;
    }
};

但是当我在编译的JavaScript代码/文件上运行JSHint时,我会有以下错误/警告:

  

使用===与null进行比较

我希望TypeScript中编译的JavaScript代码与JSHint兼容(不存在任何错误和警告)。这意味着要么应该生成正确的代码,要么应该给出编译时错误。

PS:我以前不知道tslint,但即使在使用它之后,它也没有编译与JSHint兼容的JavaScript(JSHint仍在抛出警告)。

5 个答案:

答案 0 :(得分:8)

根本不可能!从来没有构建TypeScript,目的是创建符合linter的代码。使用TypeScript时,您必须将生成的JavaScript视为字节码。没有理由查看你的字节码。

有些短信甚至可能会因为this的使用有问题而烦恼。事实上,在ES5中应该非常谨慎地使用它。但是当使用TypeScript / ES2015类定义时,你需要经常使用this,并且转换到ES5会创建很多。因此,创建与您的linter匹配的代码将迫使您不使用TypeScript的许多功能。

因此,如果你想要lint字节码,那么你应该写字节码;)

答案 1 :(得分:3)

这不是编译器的错误。

a == null与TypeScript和JavaScript中的a === null不同。

如果a为null或未定义,则

a == null将返回true,但如果a为null,则a === null将仅返回true。

答案 2 :(得分:2)

您可以使用tslint等工具,而不是使用生成的文件进行lint,而不是自己使用TypeScript文件。甚至还有一个gulp包装器可以集成到您的构建链gulp-tslint中。

答案 3 :(得分:-1)

坦白而简单:

你问的是不可能的。让我绝对清楚:不可能。除非您想重新设计整个系统。

答案 4 :(得分:-1)

TLDR外卖:

如果您正在为自己或团队寻找一个非常高的标准,JSLint。但它不一定是标准,只是 a 标准,其中一些标准性地来自一个名叫Doug Crockford的JavaScript神。如果你想要更灵活,或者你的团队中有一些老东西没有购买JSLint的意见,或者在JavaScript和其他C系列语言之间来回定期,那么试试JSHint。 / p>

长版:

分叉背后的原因很好地解释了为什么JSHint存在:

http://badassjs.com/post/3364925033/jshint-an-community-driven-fork-of-jslint http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to-jshint/

所以我想这个想法是“社区驱动的”而非Crockford驱动的。实际上,JSHint通常对JSLint的一些风格和轻微的语法“意见”更加宽容(或者至少是可配置的或不可知的)。

例如,如果您认为下面的A和B都很好,或者您想要编写具有A中一个或多个B方面的代码,则JSHint适合您。如果你认为B是唯一正确的选择...... JSLint。我确信还有其他差异,但这突出了一些。

A)开箱即用JSHint - JSLint失败

(function() {
  "use strict";
  var x=0, y=2;
  function add(val1, val2){
    return val1 + val2;
  }
  var z;
  for (var i=0; i<2; i++){
    z = add(y, x+i);
  }
})();
B) Passes Both JSHint and JSLint

(function () {
    "use strict";
    var x = 0, y = 2, i, z;
    function add(val1, val2) {
       return val1 + val2;
    }
    for (i = 0; i < 2; i += 1) {
        z = add(y, x + i);
    }
}());

我个人认为JSLint代码非常好看,而且我不同意它的唯一硬性特征是它在函数和for-loop var i = 0声明中对多个var声明的仇恨,以及一些功能声明的空白强制执行。

JSLint强制执行的一些空白内容,我发现不一定是坏的,但与家庭中其他语言(C,Java,Python等等)的一些非常标准的空白约定不同步,它们通常也被视为JavaScript中的约定。由于我在一天中使用各种语言编写,并且与不喜欢我们代码中的lint风格空格的团队成员合作,我发现JSHint是一个很好的平衡点。它捕捉的是一个合法的错误或非常糟糕的形式的东西,但不会像JSLint那样咆哮我(有时候,我无法禁用)对于我不关心的风格观点或句法挑剔。

许多好的库都不是lint'able,这对我来说证明了一些JSLint只是推送一个版本的“好代码”(这确实是好代码)的想法是有道理的。 )。但话说回来,相同的图书馆(或其他好的图书馆)可能也不是暗示,所以,触摸。