任何检查Javascript属性是否存在的工具?

时间:2013-06-24 08:54:35

标签: javascript lint jshint

给出一个示例代码:

var yyy = { abc : 1 },
    xxx = yyy.abcc + 1;

它不会抛出任何错误但是有一个错误,其中yyy.abcc应该是yyy.abc,因此由于拼写错误,xxx现在等于“NaN”。

我使用jslint,jshint来检查代码中的问题,但它不会告诉你abcc是否是有效的属性。

是否有像jslint或jshint这样的工具可以检查这个?

2 个答案:

答案 0 :(得分:1)

不要让事情复杂化:) 第一个答案是一个很好的答案,javascript中的每个对象都有一个原型,可以通过“if(undefined!= yyy.abc)”检查这将告诉你“abc”是否存在与var yyy证明yyy不是未定义本身。

答案 1 :(得分:1)

处理这些类型的常见错别字和错误确实是 Javascript 生态系统中的一个巨大漏洞,我希望更多人关心。这个问题在八年前就被问到了,但仍然没有得到很好的答案,这一事实令人非常担忧。

我查看了许多 Javascript 工具,我发现的唯一一个适用于您的案例的是 Typescript 编译器 tsc

不幸的是,由于 Javascript 映射的动态特性,它在技术上并没有按照您编写的方式处理您的情况,因为映射没有可以强制执行的严格属性,即使是由编译器也是如此。但是,如果您改为使用适当的 Javascript 类,它确实可以工作,无论如何,您确实应该为类提供的其他好处这样做。

例如,如果我将您的代码重写为:

class MyClass {
    constructor() {
        this.abc = 1;
    }
}

var yyy = new MyClass();
var xxx = yyy.abcc + 1;

并将其放入文件 test.js,然后创建一个 Typescript 配置文件 tsconfig.json 文件,其中包含(主要是 tsc --init 的默认输出):

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "allowJs": true,
    "checkJs": true,
    "outDir": "./dist",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  },
  "include": [
    "test.js"
  ]
}

然后运行:

tsc --build tsconfig.json

它正确输出错误:

test.js:11:15 - error TS2551: Property 'abcc' does not exist on type 'MyClass'. Did you mean 'abc'?

11 var xxx = yyy.abcc + 1;
                 ~~~~

  test.js:6:9
    6         this.abc = 1;
              ~~~~~~~~~~~~
    'abc' is declared here.


Found 1 error.

更好的是,它提出了一个有用的解决方案,这在编译器中很少见。

要安装 tsc 及其依赖的类型定义,您可以运行:

sudo npm install typescript -g
npm install @types/node --save-dev