ひゃたさんはエンジニアに戻りました

肩書がエンジニアに戻った人が書く技術トピック

Typescriptでnamespace使うとimportができない

Typescriptでハマったのでメモ

namespace内のクラスでEventEmitterを使おうとしたところエラーになった

namespace Example {
  import * as events from "events";
  //Error: Import declarations in a namespace cannot reference a module.

  export class Test {
    constructor(){}
  }
}

ぐぬぬ、ならばnamescape外に書けばいいんだな

import * as events from "events";
namespace Example {
  export class Test {
    constructor(){}
  }
}

これで一安心……と思ったら参照先でエラーになっている……

import Test = Example.Test//ここがエラーになる

ど、どうすればいいんだ???

悩みに悩んだ結果、namespace を勘違いしていた模様 (javaの感覚で使っていた……)

そもそも、TypeScriptは1ファイル1モジュール。namespaceは1ファイル内でモジュールの構造を作るために使うもの(内部モジュール) よって、namespaceなんて書かなければ問題はした。TypeScriptなれるまでまだもうちょっと時間かかりそう……

import * as events from "events";
export class Test {
  constructor(){}
}
import * as test from "./test.ts"

追記(2016/03/27)

id:ConquestArrow さんから指摘があったので修正

namescapeもexportをつけることで外部から参照できるようになるそうだ

つまり、このように書けば参照できる。なるほど。勉強になった

export namespace Example {
  //中略
}

参考:TypeScriptのクラスをnamespaceで拡張する(クラス定数、拡張メソッド、他) - Qiita