本文へ移動

no-implied-eval

eval()のようなメソッドの使用を禁止します。

拡張 "plugin:@typescript-eslint/recommended-type-checked" ESLint設定で 有効にすると、このルールが有効になります。

💭

このルールには 型情報が 必要です。

eval()の使用を避けることは良い習慣とされています。セキュリティとパフォーマンスに影響を与えるため、多くのリンターはeval()の使用を禁止することを推奨しています。しかし、文字列を渡してJavaScriptコードとして解釈させる他の方法にも同様の懸念があります。

最初の方法は、setTimeout()setInterval()setImmediate、またはexecScript()(Internet Explorerのみ)を使用することで、これらはすべて最初の引数としてコードの文字列を受け入れることができます。

setTimeout('alert(`Hi!`);', 100);

またはnew Function()を使用します。

const fn = new Function('a', 'b', 'return a + b');

これは、コードの文字列が渡されて解釈されるため、暗黙のeval()とみなされます。setInterval()setImmediate()execScript()でも同じことが行われます。すべてグローバルスコープでJavaScriptコードを解釈します。

ベストプラクティスは、new Function()またはexecScript()の使用を避け、setTimeout()setInterval()setImmediate()の最初の引数には常に関数を使用することです。

このルールは、new Function()setTimeout()setInterval()setImmediate()、またはexecScript()を使用した暗黙のeval()を排除することを目的としています。

setTimeout('alert(`Hi!`);', 100);

setInterval('alert(`Hi!`);', 100);

setImmediate('alert(`Hi!`)');

execScript('alert(`Hi!`)');

window.setTimeout('count = 5', 10);

window.setInterval('foo = bar', 10);

const fn = '() = {}';
setTimeout(fn, 100);

const fn = () => {
return 'x = 10';
};
setTimeout(fn(), 100);

const fn = new Function('a', 'b', 'return a + b');
Playgroundで開く

使用方法

.eslintrc.cjs
module.exports = {
"rules": {
// Note: you must disable the base rule as it can report incorrect errors
"no-implied-eval": "off",
"@typescript-eslint/no-implied-eval": "error"
}
};

Playgroundでこのルールを試す ↗

オプション

eslint/no-implied-evalオプションを参照してください。

使用しない場合

プロジェクトが、文字列引数を使用してnew Function()またはsetTimeout()setInterval()setImmediate()execScript()を許可する必要があるまれなものである場合、このルールを無効にできます。このルールを完全に無効にする代わりに、ESLintの無効化コメントを特定の状況で使用することを検討してください。


型チェックされたlintルールは従来のlintルールよりも強力ですが、型チェックされたlintの構成も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスに関するトラブルシューティングを参照してください。

リソース

ESLintコアから ❤️ を込めて提供されています。