来たる8/23(土)にLL Diverというイベントでmozaic.fm出張版があって、そこで適当にTypeScriptの何かを話す予定なので、ECMAScript 6の予習をしていきます。
司会のJxck先生は知識量豊富なので予習していかないとボコられて恥を晒して死んじゃうからね!
あんどうやすしさんは優しいと思うんだけど!!
参考資料
- わかめのECMAScript6のはてブ
- ECMAScript 6のドラフト(ログ)
- ECMAScript 6で提案されたもの
- ECMAScript 6 compatibility table
- es6-shim
- ECMAScript6をまるっと学ぶ。重要用語とか、仕様策定の進め方とか、新機能とか。
- traceur-compiler入門
ECMAScript6をまるっと学ぶ。
はすごい参考になったのでぜひ読むべきそうすべき。
この辺りをガシガシ読んでこの記事を書いていきます。
in TypeScript...
今やGitHubに開発の戦場を移して久しいTypeScriptですが、このページはGitHub wikiに移植されていなさそう。
一応Roadmapには2.0でpolyfillとか検討すんべみたいな感じ。
対応状況
これを見つつ対応状況を書いていく。
このページとドラフトrev26で採用されてる要素にすげー乖離がある気がするんだけどこれこういうものなの…。
まぁ、まだDraftのフェーズだからね…?っていうことなんすかね?
過不足とか正しい参照先とかあったら教えてください。
arrow function syntax
TypeScript → ある arrow function expression(アロー関数式)と呼ばれる。
function to string
TypeScript → ランタイムの話なので関係ない。
AngularJSとかめっちゃこの仕様に依存してるので現状追認系の仕様なんじゃろか。
function name property
function f(){} assert(f.name === "f")
こういうやつらしい。
TypeScript → 動作するかはランタイムの話。コンパイルできるかは型として関数のnameプロパティにアクセスできれば良い。
現時点でのmaster/HEADではlib.d.tsに存在してないけどFunctionインタフェースを勝手に再オープンして追加すれば良い。
こんな感じ。
interface Function {
name: string;
}
block scope bindings
TypeScript → 検討中 #19
個人的にはかなり欲しい。頑張れば arrow function expression のようにpolyfill的な実装を吐けると思うので、それやってほしいなぁ…。
Traceurちっくなことをつい求めたくなってしまうけど多分TypeScriptチームはそこはあんまし頑張る気がないと思う。
ていうか block functions ってなんなんじゃろ。
destructuring
-
destructuring
- refutable matching これ現在のドラフトに入ってないよね?
分割代入のこと。CoffeeScriptで昔から使えるので知ってる人も多いと思う。
脱構造とかダサい訳をあてられてることもある気がする。
TypeScript → 検討中 #240 検討中 PR428
Arrayをtuple的に使うdestructuringについては既に実装が造られてin Reviewな感じっぽい。
フルサポートは多分TypeScript 2.0ぐらいになると思われる。
refutable matchingが?
でoptionalを表現しているのはTypeScriptと一緒なんだけど、prefixとして使うのに対してTypeScriptでは?
はpostfixな修飾として使っているのでわりと嫌な感じがする。まぁTypeScriptの仕様が変わっても自動変換ツール書けそうだからいいんだけど…。
parameter default values
TypeScript → ある default values(デフォルト値付き引数)と呼ばれてる…かなぁ?
ES6のspecのRev26のドラフトだとGrammerにコレ書いてなくない…?記述が少ない全体的に。どういう状態なんじゃこれ。
wikiのほうのPattern Initialiser?
のPattenが何かわからない…。
rest parameters
TypeScript → ある rest parameter(可変長引数)と呼ばれている。
spread
TypeScript → 検討中 #237 検討中 #238
たぶん2.0までこなさそう。
proper tail calls
末尾再帰最適化の話かな。
TypeScript → ランタイムの話なので関係ない。
末尾再帰最適化できるできないについてコンパイラがサポートを与えるとかは可能な気がするけどまぁTypeScriptにはいらないんじゃないかな。
direct proxies
あっこれmethod_missingとか実装できるやつや…(察し
耳から聞いた情報では、Dynamic ProxiesというAPI名だった気がするんだけど違ったらしい。
TypeScript → ハイパーくっそざっくり仕様を眺めた感じ、新しいsyntaxを導入するものではない(=ランタイムの話)になるのでユーザ側で対応可能な気がする。
後述するがmodule関連のところはもちろん難しい。
simple maps and sets
TypeScript → 一応定義はある けど、generator関連のメソッドはなさそうな感じ?
weak maps
TypeScript → 一応定義はある まぁMapやSetと同じ感じぽよい
egal
is
とかisnt
みたいなオペレータが生える予定があったけど死んだっぽい。
TypeScript → function name propertyの項と同じで自分で適当に定義してやればよいだろう。
interface Object {
is(value1: any, value2: any): boolean;
}
iterators
TypeScript → generatorがないと嬉しくなさそう。未定。
for-ofは検討中 #7。
generators
TypeScript → 未定。Issueすらない!
Roadmapによると、2.0でInvestigate async/await as a desugaring to ES6
とあるのでC#のasync/await相当の構文にしたいんだろうなぁ…という感じがする。
普通にgeneratorくれよ…。
async/awaitは検討中 #5。うーん、これやる過程で入るような気もする…?
generator expressions
TypeScript → 未検討だと思う…。Issueなさそう。
マトリックスが簡単に生成できます的なやつ?嬉しさが微妙に理解できない。
array comprehensions
HaskellとかPythonでよくある配列内包表記ってやつすかね?
TypeScript → 未検討かなぁ…。Issueなさそう。
for-ofと一部ネタが被る。
multiple globals
なんのための仕様なんだこれは。現実として存在するシチュエーションに仕様を与える系のやつなのか?
モチベーションがわからん…。
TypeScript → たぶん型システムレベルで整合性取れれば問題ない気がするので現時点で対応可能だと思う。(Node.jsのvm.runInNewContext
とかを想像して書いてる)
modules
- modules (最新の仕様ではない)
TypeScript → 仕様確定待ち #117 ES6での仕様が固まったら対応予定らしい。
TypeScriptの外部モジュールの仕様に変更があると思われる(派生して内部モジュールのimport句も多分変わりそう)。
destructuringの仕様を実装してからこっちの対応かなぁ。たぶん。
modules standard
おー。こういう定義になるんだ…。面白い。
TypeScript → modulesの対応がされないとこっちも解決されない。
lib.d.tsが分割される程度の影響じゃないかなぁ?
object literals
<|
とかいう記法が導入されててビビる。
細かい記法が色々とあるなぁ…。
結論を先に書くと以下子要素全部未対応。
Set Literal [[Prototype]] Operator
TypeScript → 提案 #489 が似てるけど蹴られてる。
後日ES6の気持ちをもっと理解したら聞いてみよう(聞かない可能性が高い
Object Literal Property Shorthands
TypeScript → 未対応。欲しがる人あまりいなさそうではある。
Object Literal Property Value Shorthand
TypeScript → 提案 #418
Object Literal Computed Property Keys
TypeScript → 未対応。
そもそもSymbolがねぇ。
Object Initialiser super References
TypeScript → 未対応。
Set Literal [[Prototype]] Operator に依存してるのかな。
Object Extension Literal
de-destructuringみたいな…。
TypeScript → 未対応。
maximally minimal classes
なんでこんな長い名前やねん。
TypeScript → ある
generator method以外は全部あるんちゃうかなー。privateがあったりして独自の拡張もあり。
privateといってもSymbolを使っているわけではないのでJSに変換後のコードを見ると普通にアクセスできちゃう。
また、TypeScriptでは自由な式としてclassが記述できるわけではないので記述可能な箇所がES6に比べるとだいぶ制限される。
例えば関数の中にクラス定義を書いたりはできない。
private name objects
gensymっぽい。つまりはLispだ!!(暴言
TypeScript → 未対応。
quasis
かなり魅力的に見える。欲しい。
TypeScript → 未対応。
後日提案してみよう。
typed object
TypeScript → 20秒仕様を眺めた感じ、型定義ファイルのレベルで対応できそうな気がする。uint8
とかの型アノテーションぽく見えるやつは多分実際に存在するなんらかの値(Symbol?)だよね…?
あとはランタイムの問題。
わからん。実際やってみたらだめかも…??
observe
TypeScript → ランタイムの話なので関係ない。型定義ファイル作って頑張れ。
その他
Number.isFinite
などなど。だいたい便利関数生やした系だと思うので型定義ファイル作って気合でなんとかしろ!で収まるのではなかろうか。
たぶん。変な子が紛れ込んでたら教えてください。
Promise
そういえばPromiseがないな…??
型定義ファイルと適当なpolyfillでも使ってください。
azuさんのPromise本は今後必読ということでいいと思います。
ひとりごと
- こんすとさん知らないっていったらめっちゃdisられたけどES6調べてたらめっちゃこんすとさん出てきた
- ていうか色々なスライドを読んだことがあった…
- JS界隈 必要とされる知識の範囲がクソほど幅広くてエッジな人々の話に混ざるのすごい大変だと思う
- ECMAScript 7の提案中の仕様とかってどこでチェックすればいいの…
Postした後に得られた情報
コメントに @yosuke_furukawa が情報くれた。
コメントに JS.next の hikaru_oao さんが情報をくれました。
ES wikiってドラフト以外更新されてないきがするんだけど、今参照してもいいもんなのかなー? "ECMAScript6 - TypeScriptとECMAScript 6 - Qiita" http://t.co/EpqsmUrQE8
— azu (@azu_re) 2014, 8月 21
少なくともTypedObject, Object.observeはES7以降にpostponeされたものなわけだが。ES6についてはDraft読んだ方が良いと思います。 http://t.co/oi6nYjZlWb
— さねさね (@saneyuki_s) 2014, 8月 21
最新情報はメーリングリスト or http://t.co/jJo58cTrUd とか、https://t.co/c67Unt772W を読みましょう。 / “ECMAScript6 - TypeScriptとECMAScript …” http://t.co/YuPxw4Vjdf
— てらまこ (@teramako) 2014, 8月 21