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());
void
と undefined
の区別ってこんなに厳しかったかな……。どこかのタイミングで型定義ファイルが厳しくなったんじゃないかな……。
こうなっている理由はなんとなく分かる。 null
や undefined
を明確に分離するようになったことで、↓のような判断がされているのだろう。
// 良くない定義 type f = (x?: number): void | number; // 良い定義 interface f { (): void; (x: number): number; }
上記は ?
によって undefined
を許容してしまうし、「 省略したとき void
を返す」という情報が落ちてしまう。
Promise.resolve()
でも似たような判断があるのだろう。
直しついでに誰も使っていないであろう browser support を打ち切って、使いかたも変えてしまおうと思っている。当時は迷ってこれにしたのだけど、良くなかった。ぼく自身が使わない機能は腐っていく。誰かがサポートしないなら消していこう。