bouzuya.hatenablog.com

ぼうずやのにっき

TypeScript で Qiita 記事を数える script をつくった

今日つくりかけている free cell ではなく、2016-01-07 につくった bouzuya/cars-counter-qiita-items のことを書く。

bouzuya/cars-counter-qiita-itemsbouzuya/cars の counter のひとつだ。 Qiita への投稿数を収集する。

この cars counter script の目的は 2016 年の数値目標のひとつである Qiita 記事の投稿数にを自動で計測するためだ。

実装は TypeScript で書かれており Node.js で動く。npm package "node-fetch" および npm package "moment" を利用している。JavaScript で書くとなんてことはないものなのだけど……。

今回の経験としてはまた .d.ts の問題。

moment.d.tsexport default moment ではなく export = moment されている。なので import moment from 'moment'; では import できない。import * as moment from 'moment'; すると import できる。

import * as moment from 'moment'; の場合は moment{ default: moment ... } になる。これにより moment() で実行時に error が出る。かといって moment.default().default が定義されていないため、型 error になり compile できない。

対処方法が分からず、諦めて .d.ts を copy & paste して export = moment 部分だけを書き換えたものを使うことにした。

node-fetch は DefinitelyTyped に存在しない。whatwg-fetch はあるのだけど、これは window.fetch のためのものなので moment と同様に copy & paste して対応した。

TypeScript の import / export はまだ問題があるように見える。TypeScript の持つ何種類もの import / export をそれぞれが統一せずに利用している。ぼくは TypeScript に詳しくない。それでも JavaScript の superset を目指しているなら module は es6 module にならうのだろう。

ぼくは es6 > babel > browserify の先頭に typescript を加えたい。つまり typescript > es6 > babel > browserify という流れをつくりたい。