Express4 + TypeScript


以下を利用すれば可能だけど、いつまで保守されるか分からないので修正する手順を残しておく。
最終的な修正結果は以下と同じになります。
https://github.com/czechboy0/Express-4x-Typescript-Sample


npm install をする前に jsファイルをtsファイルに変換する。
といっても、拡張子をjsからtsに変えるだけ。
expressのnode_moduleはjsファイルのままでいーけど、
app.js とか route直下のjsファイルは変換する。
手作業は面倒なので以下のシェルでやるが、
以下のシェルはディレクトリを再帰的に辿って変換してしまうので、
node_module も変換してしまう。
すでに npm install してしまった場合は
node_moduleにjsファイルが存在すると思うので、
一度アンインストールしてください。
シェルはルートディレクトリで実行してください。

# find . -type f -name "*.js" -print0 | while read -r -d '' file; do mv "$file" "${file%%.js}.ts"; done

express自体はJSで書かれているので、
それらをTypeScriptで利用するには定義ファイルがないといけない。
tsdでexpressを動かすのに必要な定義ファイルを用意する。

# tsd init
# tsd query node expre serve-favicon morgan cookie-parser body-parser debug -rosa install

bin/www を www.ts にリネームし、 reference を記述する。
referenceを記述することでexpressのJSファイルをインポートできる。

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


app.js, router/index.js, router/user.js の
'var require()' を利用している箇所を 'import require()' に修正し、
module.exports を export に修正する。
TypeScriptのトランスパイルオプションで CommonJS を利用するので、
モジュールのexport表記もCommonJSに合わせる必要がある。

var express = require('express');
↓
import express = require('express');


module.exports = router;
↓
export = router;


app.js の err.status を err['status'] に修正する。複数箇所あるので注意。
TypeScriptでは err.status で関数呼び出しになるっぽいので、
プロパティ参照は err['status'] の表記に修正する必要がある。


app.js の app.use(function(err, req, res, next) を
app.use(function(err: any, req, res, next) に修正する。
型チェックでエラーになっているが、詳しくは不明。
err を any型(何でも入る型)で指定すれば問題ないみたい。
複数箇所あるので注意。

ここまで修正したらトランスパイルしてみる。
対象は www.ts になり、成功すれば各tsファイルに対応したjsファイルができるはず。
ただ、何かしらのエラーが発生するはず。

# tsc --sourcemap --module commonjs ./bin/www.ts

そのうちの1つが以下。
nodeがes6対応していないのであれば、
es6用のモジュールが存在しないので、エラーが出るはず。
定義ファイルからモジュール定義の記述を削除しておく。
詳しくは以下を参照。
http://d.hatena.ne.jp/pospome/20150620/1434822025

typings/node/node.d.ts(255,26): error TS2304: Cannot find name 'DataView'.
typings/node/node.d.ts(269,21): error TS2304: Cannot find name 'Map'.
typings/node/node.d.ts(278,21): error TS2304: Cannot find name 'Set'.
typings/node/node.d.ts(288,25): error TS2304: Cannot find name 'WeakMap'.


トランスパイルでエラーが出る可能性は高いと思う。
いろいろ試して最後に修正点をまとめたから、
そもそも上記の手順に修正漏れがあるかも。
ただ、エラーを読めばだいたい修正内容が分かるはず。
ここが頑張りどころ。

エラーが出なくなって、jsファイルが出力されたら実行してみる。

# node ./bin/www.js

問題なければ www をエントリーポイントにするために www を作って、www.js をrequire()する。
# vim www

#!/usr/bin/env node

require('./www.js');


これでいつも通りに実行できる。

# npm start