2017-03-16 69 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

謝謝,我更新了問題 –