AngularはDecoratorsが標準化されなくても困らない
#Angular #TypeScript
TypeScriptの Decorators 構文は TC39プロポーザルのtc39/proposal-decorators をベースとしている。
AngularのAPIではこの構文を使って @Component や @Directive などのデコレータが多用されているが、実はAngularはTC39でのDecorators仕様の標準化が遅れたり仕様が今後変わったとしても、ほとんど困らない。
Angularのデコレータは静的解析にしか使われていない
TC39のプロポーザルの観点は構文と振る舞いに二分されるが
構文についてはそもそも別言語からの輸入である時点で議論の余地はそれほど多くない
振る舞いについての議論が長く続いている
ところでAngularはコード生成のための静的解析にしかデコレータを使わない
Angularが提供するデコレータはAoTコンパイル後にはまったく残らない
Angularにとってのデコレータ
テンプレートコンパイルとDependency Injectionを静的解決するためのメタデータを提供するマーカー
TypeScriptのAST上で見つけやすく、メタデータを取り出せればそれでいい
つまりAngularからの関心はデコレータがTypeScript AST上でどう表現されるかというところにしかない
よって、AngularはDecoratorsの振る舞いが標準化されなくても困らない
TypeScriptの構文として存在さえしていればいい
TypeScriptがデコレータ構文自体をいまさら取り下げることは考えづらい
AtScriptという概念
Keynote: AtScript - Google スライド
2014年、まだ "Angular2" という名前すらついてなかった時期
Misko Heveryが次期Angularに使われる言語が満たすべき条件を定義した
その名も AtScript
At: A-nnotation and T-ypes (要出典)
アノテーション(デコレータ)構文と静的型付けが必須条件だとした
そのときの世の中は...
ES6が策定されている最中(classの標準化が目前)
TypeScript黎明期(デコレータはまだない)
AtScriptに相当する機能はJavaScriptエコシステムにはなかった
なので、プロトタイプ実装に用いられたのがDart言語
当初AngularDartはAngular2に必要な技術要素を検証するための実証実験プロジェクトだった
時が流れTypeScriptにデコレータが実装された
TypeScriptがAtScript要件を満たすことになったので、Angular2は無事TypeScriptで実装されることになった
そして今に至る
余談: AngularDartはその後完全に独立してDartエコシステム内での開発が続けられている
AngularにとってTypeScriptはAtScript要件を満たすひとつの言語実装ということ