TypeScriptとECMAScript 6

  • 100
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

来たる8/23(土)にLL Diverというイベントでmozaic.fm出張版があって、そこで適当にTypeScriptの何かを話す予定なので、ECMAScript 6の予習をしていきます。
司会のJxck先生は知識量豊富なので予習していかないとボコられて恥を晒して死んじゃうからね!
あんどうやすしさんは優しいと思うんだけど!!

参考資料

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

分割代入のこと。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 さんが情報をくれました。