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 の「型空間」と「値空間」の区別を理解しておくと、今回のエラーは自然と回避できます。


