2016-07-14 24 views
0

一個不存在的財產我有一組常數,恰似檢查任何地方的代碼要求

let codes = { 
    OPEN_ACCOUNT: 1000, 
    CLOSE_ACCOUNT: 1001, 
    DEPOSIT_FUNDS: 3000 
    ... 
} 

有時按鍵被重命名,或添加或刪除,因此codes的結構對象變化。由於應用程序是相當大的,我會很樂意靜態分析與喜歡的JSLint/TSLint一些工具情況下,代碼時功能與不再可用的代碼運行:

runServerRequest(codes.DEPOSIT_FUNDS_SPECIAL_CASE, 500) 

在上面的例子中DEPOSIT_FUNDS_SPECIAL_CASE是不存在於代碼對象中,所以從分析器得到警告將是非常好的。在所有可能的情況下,不應該存在請求不存在的字段的情況。

我該如何解決這個問題最簡單的方法?

+0

問題是由服務器團隊球員自動生成代碼的目的,是被推到了回購。 –

+0

如果你使用打字稿,那麼編譯器應該抱怨它,[像這裏一樣](https://www.typescriptlang.org/play/#src=let%20codes%20%3D%20%7B%0A%09 %09OPEN_ACCOUNT%3A%201000%2C%0A%09%09CLOSE_ACCOUNT%3A%201001%2C%0A%09%09DEPOSIT_FUNDS%3A%203000%0A%09%7D%0A 0A%%09console.log(codes.OPEN_ACCOUNTS)% 3B) –

+0

是的,應用程序正處於向TypeScript遷移的過程中,因此codebase現在是JS + TS的混合體,當所有代碼都在TypeScript中時,它可能會被修復。 –

回答

1

的一種方式做,這是建立一個Proxy object,如果你訪問一個不存在的屬性,會拋出:

// define codes above this line. 
codes = new Proxy(codes, { 
    get: function(target, prop) { 
    if (!target.hasOwnProperty(prop)) { 
     throw new Error('Attempting to use the deleted code `' + prop + '`.'); 
    } 
    return target[prop] 
    } 
}); 

get method將捕獲所有訪問code.some_property如果沒有定義它扔。
請注意,如果該屬性已明確設置爲undefined,則此不會拋出

Can I Use?

+0

他正在尋找一個靜態分析解決方案,它不會真正幫助您在運行時查找這些解決方案(例如在生產中) –

+0

我正在尋找靜態方法來分析此問題。正如Nitzan所說。 –

+0

@Sergei是的。我想我會把它留在這裏,以防將來有人使用它。 –