@hiroqn が書いた『実例とともに学ぶECMAScript 2015 〜Generator〜 – NET BIZ DIV. TECH BLOG 』を TypeScript で写経して Generator について学んだ。
関連 Tweet は次のとおり。
良記事 / “実例とともに学ぶECMAScript 2015 〜Generator〜 – NET BIZ DIV. TECH BLOG” https://t.co/UUPy4Byahe
— bouzuya (@bouzuya) 2016年6月17日
https://t.co/o1QzLNXVzZ
— bouzuya (@bouzuya) 2016年6月19日
を写経 & 問題を解いた。TypeScript だと問題のある記述がぱらぱらとあった。ぼくの解答は↓。https://t.co/srBiykQeOG
結果の Gist は https://gist.github.com/bouzuya/1a6b7c8d8c90dddc7f8e0f47beab7589 にある。
ぼくは generator function (function*
) を TypeScript でほとんど使わなかったのだけど、すこし分かってきた。今後は使えるところで使っていきたい。 beater の generator function 対応も検討しているので、必要になるだろう。
せっかくなので改めて MDN で Generator について調べた。
Generator
は generator function (function*
) によって返される object だ。Generator
は iterable protocol と iterator protocol の両方を満たすものだ。
TypeScript の ES2015 向けの型定義 (lib.es6.d.ts
) に従うなら、次のようになる。
// Iterable.prototype.next() の戻り値 interface IteratorResult<T> { done: boolean; value?: T; } // Iterator protocol interface Iterator<T> { next(value?: any): IteratorResult<T>; return?(value?: any): IteratorResult<T>; throw?(e?: any): IteratorResult<T>; } // Iterable protocol interface Iterable<T> { [Symbol.iterator](): Iterator<T>; } // Generator interface IterableIterator<T> extends Iterator<T> { [Symbol.iterator](): IterableIterator<T>; }
TypeScript での Generator
は IterableIterator<T>
だ。generator function (function*
) は IterableIterator<T>
を返す関数だ。IterableIterator<T>
は Iterator<T>
で、それ自身を返す [Symbol.iterator]()
を持つ。なるほど。
Iterable<T>
は for...of
/ spread operator (...
) / yield*
/ destructuring assignment に対応している。また String / Array / TypedArray / Map / Set は built-in iterable だ。
一度、写経するとすっきりと分かる。書いてみることは大切だな。