Skip to content
← Back to rules

import/namespace 正しさ

何を実行するか

完全な名前空間としてインポートされた場合(例:import * as foo from './foo'; foo.bar();)、参照される時点でその名前が存在していることを強制します(例:./foobar をエクスポートしていない場合、foo.bar() に対して警告を出力します)。エクスポートされている名前が見つからない場合、インポート宣言の時点で報告されます。また、計算された参照(例:foo["bar"]())に対しても報告します。インポートされた名前空間のメンバーへの代入についても報告します。

なぜ悪いのか

存在しない名前を参照すると、ランタイムエラーやコード内の予期しない動作を引き起こす可能性があります。これにより、コードの信頼性が低下し、メンテナンスが難しくなります。どの名前が有効であるかが明確でなくなるためです。このルールにより、すべての参照される名前が定義されていることが保証され、コードの明確さと堅牢性が向上します。

次のような状況を想定します。

javascript
// ./foo.js
export const bar = "I'm bar";

このルールに対する誤りの例:

javascript
// ./qux.js
import * as foo from "./foo";
foo.notExported(); // エラー: notExported はエクスポートされていません

// インポートされた名前空間のメンバーへの代入
foo.bar = "new value"; // エラー: bar は再代入できません

// 存在しないエクスポートに対する計算された参照
const method = "notExported";
foo[method](); // エラー: notExported は存在しません

このルールに対する正しい例:

javascript
// ./baz.js
import * as foo from "./foo";
console.log(foo.bar); // 正しい: bar はエクスポートされています

// 計算された参照
const method = "bar";
foo[method](); // 正しい: method はエクスポートされた関数を指しています

設定

このルールは以下のプロパティを持つ設定オブジェクトを受け入れます:

allowComputed

type: boolean

default: false

インポートされた名前空間に対する計算された参照を許可するかどうか。

使用方法

設定ファイルまたは CLI でこのルールを有効化するには、次のように使用できます:

json
{
  "plugins": ["import"],
  "rules": {
    "import/namespace": "error"
  }
}
bash
oxlint --deny import/namespace --import-plugin

参照