blog.bouzuya.net

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 KlassAmodule.exports.KlassA = KlassA; になるくせに、いざ KlassAexport してもできない。たぶん、いろいろ制約があるからなんだろうけど、ストレスフル。

ぼくもう上記のような Node.js 時代に慣れ親しんだ require したものを module.exports に入れて export するのは諦めた。

1 ファイル 1 クラス。直接 import 。まるで Java みたいだけど、たぶん、こういうスタイルで書くのが TypeScript で external module で書くなら素直な書きかたなのだと勝手に決めた。

よもやまばなし。

イスラム国で日本人 2 人の殺害予告が出ていた。2 億ドルを要求してるんだっけ。また「自己責任」ってなるのかな。いつかもあったよね、こういうの。

あと、これは今日のことじゃないけど、フランスの新聞社がイスラム教徒を煽ってる件。ああいうの、いろんなスケールで見るよね。譲れないんだろうな。どっちも。

その他。

Atom editor で autocomplete-plus をインストールした。キーバインドをすこし変えて使っている。良いのでは。