読者です 読者をやめる 読者になる 読者になる

若き JavaScripter の悩み

何かをdisっているときは、たいていツンデレですので大目に見てやってください。愛です。

HTML5 Conference 2016 の発表で自分の仕事が少しだけ紹介されていて嬉しい

HTML5 Conference 2015 の @dynamis さんの発表で、過去の闇祓い業に触れられていました。

dynamis さんの発表

28ページ目でちょろっと触れられています。

闇祓い業

alpha.mixi.co.jp

まとめ

うれしい 😊

TypeScript の Promise<T> が Promise<T, E> ではない理由の心当たり

TypeScript の Promise の型 だと、型パラメータが Promise#then 側しかなくて、 Promise#catch 側の型が any になってしまって不便だ。 もし、catch 側の型についても型引数で指定できたなら、より安全なプログラミングができる。

そこで、catch 側の型を指定していない理由について考察してみた。

理想

const promise: IdealPromise<T, E> = getPromise();

promise
  .then((x) => { /* x は T 型 */ });

promise
  .catch((e) => { /* e は E 型 */ });

実際

const promise: Promise<T> = getPromise();

promise
  .then((x) => { /* x は T 型 */ });

promise
  .catch((e) => { /* e は any 型 */ });

考察

前提条件

TypeScript/JavaScript には以下の制約がある:

  • 制約1: TypeScript は関数の評価時に発生しうる例外の型を検査しない
  • 制約2: JavaScript はなんでも throw できる(例: throw null
  • 制約3: new Promise(fn) に与えられた関数 fn が例外 e を発生させた時、この Promise インスタンスは理由 e で棄却状態になる

帰結

これらの制約の上でうまく型付けしようとすると、catch 側は any にならざるをえない。

TypeScript の型検査器は、new Promise(fn)fn が発生しうる例外の型を推定する材料を持っていない。 JavaScript はどんな値・オブジェクトも例外として発生させられるので、fn から発生しうる例外の型は any であると推論するほかない。 そして、この fn が例外 e を発生させたとき、この Promise は e で棄却状態になる。 このとき、e の型は、前述の通り any としか推論できない。したがって、catch の引数の型は常に any である。 であれば、catch 側の型引数は必要ない。

理想に近づくためには

TypeScript に例外の型宣言ができるようになれば、できそうな気がする?

例えば:

function resolver<T, E>(resolve: (x: T) => void, reject: (e: E) => void): a throws E {
  // ...
}

const promise: Promise<T, E> = new Promise(resolver);

promise
  .then((x) => { /* x は T 型 */ });

promise
  .catch((e) => { /* e は E 型 */ });

SEE ALSO

github.com github.com github.com

JavaScript開発における多段式エラープルーフについて

JavaScript TypeScript 多段式エラープルーフ

第14回HTML5ビギナーズで、JavaScriptデバッグ作業を短くする「多段式エラープルーフ」について発表してきました。

スライド

speakerdeck.com

コードのサンプル

github.com

まとめ

JavaScriptデバッグ作業を素早くこなすなら、多段式エラープルーフが必要です。

去年、株式会社ミクシィの新人賞をもらいました

去年(2015年)、株式会社ミクシィから新人賞をいただきました。

受賞後に、Facebook で報告してましたが、タイムラインが流れてしまうと経歴として見えなくなってしまうことに気がつきました。 なので、こちらに再度貼っておきます。

f:id:devorgachem:20160108183959j:plain

社内の依存モジュール検索エンジンにグラフ表示機能を入れた結果

結果はこちらになります:

ご査収ください。