oinume journal

Scratchpad of what I learned

TypeScriptでNode.jsのexpressを使ってHello worldしてみる

TypeScriptでexpressを使ってHello worldしてみた。けっこうはまったのでメモメモ。使ってるTypeScriptのバージョンは1.0.1。

準備

npm install -g typescript
npm install --save express

試しにコンパイル

こんな感じのコードを書いてコンパイルしてみる。

$ tsc --module commonjs hello.ts

コンパイルエラーが...(;´Д`)

./typescript-sample/server/hello.ts(1,1): error TS2071: Unable to resolve external module ''express''.
./typescript-sample/server/hello.ts(1,1): error TS2072: Module cannot be aliased to a non-module type.
./typescript-sample/server/hello.ts(2,1): error TS2071: Unable to resolve external module ''http''.
./typescript-sample/server/hello.ts(2,1): error TS2072: Module cannot be aliased to a non-module type.
./typescript-sample/server/hello.ts(5,11): error TS2088: Cannot invoke an expression whose type lacks a call signature.
./typescript-sample/server/hello.ts(6,17): error TS2095: Could not find symbol 'process'.

定義ファイルをコピー

いろいろググったところ、expressやNode.jsの標準ライブラリの定義ファイルみたいなものが必要らしいので、ここから以下の2つをhello.tsと同じディレクトリに配置する。

  • node/node.d.ts
  • express/express.d.ts

なお、express.d.tsのL13

/// <reference path="node.d.ts" />

のように修正する必要がある。(ディレクトリ構造が違うため。これ、DefinitelyTypedのディレクトリ構造のままじゃ駄目なのかなー?)

追記

$ npm install -g tsd
$ tsd query express --save --resolve --action install

して、hello.ts に

/// <reference path="typings/tsd.d.ts" />

を追記することで型定義ファイルを参照することができるようになった。vvakame さんありがとうございます!

もう一度コンパイル

これでもう一回コンパイルしてみる。今度は成功するはず。

$ tsc --module commonjs hello.ts

あとは生成された hello.js を実行して、http://localhost:3000/ にアクセスして Hello world! と表示されればおk

ちなみに --module というオプションは生成するJSのモジュール形式。

  • commonjsを指定するとCommonJS形式(Node.jsのrequire)
  • amdを指定するとRequire.js形式(ブラウザで使う場合)

となるみたい。

あわせて読みたい

IntelliJ IDEAでTypeScriptの開発環境を作ってみる - おいぬま日報

TypeScriptリファレンス Ver.1.0対応

TypeScriptリファレンス Ver.1.0対応