2017-03-16 88 views
0

我希望能够使用静态代码分析工具(标准/ eslint)来检测以下情况:使用命令行工具(eslint /标准)检测嵌套未定义的属性

const obj = {a: {b: 'just a value'}} 
    // should be obj.a.b 
    const b = obj.a.c 
    // so b will be undefined 

无论是标准ESLint在这里找不到任何问题。 是否有可能使用优质的代码质量工具来检测它?

只给例子,IDEA/Webstorm正确 enter image description here

所以报告的问题,只是想知道,是有可能使用命令行工具检测到同样的问题。

+0

你想抛出一个异常? – BNilsou

+0

@BNilsou是的,我想通过静态代码质量工具提出警告/错误 –

+0

我认为这篇文章和自定义规则可能会指向您正确的方向: http://blog.cowchimp.com/writing- a-custom-eslint-rule-to-spot-undeclared-props/ – 0xDEFACED

回答

1

静态类型跳棋,如FlowTypeScript旨在捕捉这类错误。尝试粘贴示例代码try Flow editorTypeScript playground。如果没有对代码进行任何修改来添加特定的类型注释,那么两个检查器都会发现错误。

Flow

4: const b = obj.a.c 
       ^property `c`. Property not found in 
4: const b = obj.a.c 
      ^object literal 

TypeScript

Property 'c' does not exist on type '{ b: string; }'. 
0

在JavaScript中,undefined是变量的正确值,因此您无法检测到该值的分配。 对于你的问题,我建议你这样定义一个函数:

const assignNested = function(value) { 
    if (value === undefined) 
    throw new Error("undefined assignment"); 
    return value; 
} 

然后当跟着你可以重写代码:

const obj = {a: {b: 'just a value'}}; 
const b = assignNested(obj.a.b); // b = 'just a value' 
const c = assignNested(obj.a.c); // raise exception 

不要忘记赶上你扔异常。如果你想定义你自己的异常类型,这是可能的(看看https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Error)。

+0

谢谢,我已更新问题 –

0

Javascript不是一种类型化的语言,因此在运行代码之前验证对象解构是不可能的。

例如,当您从HTTP请求获得响应时,代码质量工具不知道生成的JSON对象。

+0

谢谢,我更新了问题 –