15 min/d

ぼうずやのにっき

bouzuya/beater を直している

bouzuya/beater を直している。

ひさしぶりに使おうとしたら、 TypeScript 2.x で動かないことに気づいたからだ。大きな問題は test() の第二引数が () => void ではダメなことなどだ。

// ↓のようなおそらく最も簡単な場合からダメ。
test('1 === 1', () => {
  assert(1 === 1);
});

ほかにも TypeScript 1.8 だし typings を使っていたりと古い。

直している過程で、 ↓のようなコードが通らないことに気づいた。

const f = (): void => void 0;
Promise.resolve(f());

voidundefined の区別ってこんなに厳しかったかな……。どこかのタイミングで型定義ファイルが厳しくなったんじゃないかな……。

こうなっている理由はなんとなく分かる。 nullundefined を明確に分離するようになったことで、↓のような判断がされているのだろう。

// 良くない定義
type f = (x?: number): void | number;

// 良い定義
interface f {
  (): void;
  (x: number): number;
}

上記は ? によって undefined を許容してしまうし、「 省略したとき void を返す」という情報が落ちてしまう。

Promise.resolve() でも似たような判断があるのだろう。

直しついでに誰も使っていないであろう browser support を打ち切って、使いかたも変えてしまおうと思っている。当時は迷ってこれにしたのだけど、良くなかった。ぼく自身が使わない機能は腐っていく。誰かがサポートしないなら消していこう。