2015-01-21 TypeScript の import require ではまった
週ぶり (shuburi) 2015-W04 。
bouzuya/hspd-search に検索ボックスを追加した。あとデモサイト hspd-search.herokuapp.comをつくった。
相変わらず TypeScript の書きかたではまっている。
Node.js における以下のようなコードを書きたいのだけど、どう書けばいいのかでかなり迷った。
var KlassA = require('./klass-a').KlassA;
var KlassB = require('./klass-b').KlassB;
module.exports.KlassA = KlassA;
module.exports.KlassB = KlassB;
import
したものを export
したいだけなんだけど、意外とこれが難しい。
まず import KlassA = require(...).KlassA;
のように require
のあとに何かを続ける書きかたはできない。require
は TypeScript ではかなり特殊な構文みたい。
import m1 = require('./klass-a');
import KlassA = m1.KlassA;
ぼくはもう require(...).KlassA;
のような Node.js 時代に慣れ親しんだ export
は諦めて var KlassA = require(...);
のように直接 class を export
するようにした。それなら以下のように書ける。
import KlassA = require('./klass-a');
で、最初の例のように import
してから export
しようとすると以下のようになる。
import a = require('./klass-a');
export var KlassA = a;
これは気持ち悪い。top-level で export しないといけないので、KlassA
という名前で import
できない。もちろん export KlassA = require('./klass-a');
なんて書きかたもできない。
で、出力される d.ts
が次のようになる。
import a = require('./klass-a');
export declare var KlassA: typeof a;
typeof a;
なんでたぶん a
と同じ型 (つまり、KlassA
) なんだけど、なんだかなあ。export class KlassA
にできないんだよね。export class KlassA
が module.exports.KlassA = KlassA;
になるくせに、いざ KlassA
で export
してもできない。たぶん、いろいろ制約があるからなんだろうけど、ストレスフル。
ぼくもう上記のような Node.js 時代に慣れ親しんだ require
したものを module.exports
に入れて export
するのは諦めた。
1 ファイル 1 クラス。直接 import
。まるで Java みたいだけど、たぶん、こういうスタイルで書くのが TypeScript で external module で書くなら素直な書きかたなのだと勝手に決めた。
よもやまばなし。
イスラム国で日本人 2 人の殺害予告が出ていた。2 億ドルを要求してるんだっけ。また「自己責任」ってなるのかな。いつかもあったよね、こういうの。
あと、これは今日のことじゃないけど、フランスの新聞社がイスラム教徒を煽ってる件。ああいうの、いろんなスケールで見るよね。譲れないんだろうな。どっちも。
その他。
Atom editor で autocomplete-plus をインストールした。キーバインドをすこし変えて使っている。良いのでは。