TypeScript の import 文で「Cannot use namespace ‘X’ as a value」エラーが出る理由

ypeScript を使っていると、
「Cannot use namespace ‘X’ as a value」
というエラーに遭遇することがあります。

これは “namespace を値として扱おうとした” ときに発生する典型的な TypeScript 特有のエラーです。型と値の扱いを誤ると簡単に起こるため、初心者から中級者までつまずきやすいポイントです。

この記事では、原因の根本理解と、正しい import の書き方、典型的な落とし穴をわかりやすく解説します。

このエラーが起きる理由

TypeScript には「型として存在するもの」と「実行時に存在する値」があり、namespace は基本的に 型のための領域 です。

そのため、次のように namespace を “値” として扱うとエラーになります。

間違った例(エラー発生)

import * as MyTypes from './types'

const x = MyTypes; // ❌ Cannot use namespace 'MyTypes' as a value

import * as MyTypes で持ってこられるのは 型情報だけ であり、実行時に参照可能なオブジェクトではありません。

よくある落とし穴

#### 1. 型を default import しようとしてしまう

import MyType from './types'; // ❌ 型は default import できない
正しい書き方
import type { MyType } from './types';

#### 2. namespace import を値として扱ってしまう

強引に namespace 的にまとめた型ファイルを作ると起きがちです。

// types.ts
export type A = string;
export type B = number;

// main.ts
import * as MyTypes from './types';

const v = MyTypes.A; // ❌ 値としてアクセスできない
正しい書き方
import type { A, B } from './types';

#### 3. enum との混同

enum は実行時にも値として存在するため動作が異なります。

import { MyEnum } from './enums';

const x = MyEnum.A; // ✅ OK(enum は値として存在)

namespace と enum の違いを混同するとエラーの原因になります。

解決方法

#### 1. 型として扱う(type import を使う)

import type { User, Config } from './types';

#### 2. 値が必要ならオブジェクトを export する

// config.ts
export const settings = {
  retry: 3
};
// main.ts
import { settings } from './config';
console.log(settings.retry); // OK

#### 3. 型と値を分離する

型は型、値は値と明確に分けるとエラーが起きません。

まとめ

  • namespace は 値としては存在しない
  • import * as で得られるのは “型空間” であり値ではない
  • 値が欲しいなら export const などで実体を提供する
  • 型を取り込む場合は import type を使う

TypeScript の「型空間」と「値空間」の区別を理解しておくと、今回のエラーは自然と回避できます。

タイトルとURLをコピーしました