Experts.jp日本に、もっとエキスパートを。(13)こんにちは、編集長の白石です。2017に登壇したエキスパートに、お話されたセッションのトピックを中心に語っていただこうとういものです。セッションの内容をより深く理解する手助けになるだけでなく、本記事単体でも面白く読んでいただけることを目指しています。今回お話を伺ったのは、株式会社サイバーエージェントの青野健利さんです。TypeScript」に関するスライド資料は、こちらで公開されています。本稿のサンプルコードは、ほとんどが上記スライドから引用したものになります(一部説明を簡略化するため、青野さんの許可を得て筆者が書き換えた部分もあります)。今回のインタビュー、および対象セッションは大変内容が濃く、記事にすると長大になりすぎる&スライド資料が大変参考になるため、「型」の話に絞った記事として再構成させていただきました。青野さん、今日は取材をお受けいただきありがとうございます。簡単に自己紹介をお願いします。はい、私は2010年ごろからWeb系の仕事に従事していまして、2011年からサイバーエージェントに所属しています。普段は広告系の部署で、チャットボットのツールを作ったりしています。いうか、TypeScriptしか使っていません(笑)。TypeScriptとは、Microsoftが作ったJavaScriptのスーパーセットですね。特徴は静的型付けの言語だということ、あとはECMAScriptの新しい仕様を先取りしているというところですね。AltJSと呼ばれる言語の中では、頭一つ抜きん出て利用されている言語じゃないかと思います。Dive」というセッションタイトルでもあったとおり、かなり深いところまでお話されてそうですよね。私も普段TypeScriptは使っていますが、どこまで一緒に潜れるか、不安です(笑)。簡単なところから教えてください。はい、まずは型についてお話しましょう。TypeScriptにおける型の最も大きな特徴は、コンパイル時にのみ評価されるということですね。コンパイルされた結果のJavaScriptは型を持たない言語ですから、当然型の情報は含まれていません。TypeScriptは型を書かなくてもよい言語です。型推論があるので、変数の型が代入文から自動的に推論されます。anyという型があって、この型の変数に対しては、どんなプロパティアクセスやメソッド呼び出しを行ってもコンパイルエラーになりません。これらの特徴は、すべてJavaScriptとの統合を真面目に考えているからこそです。既存のJavaScript資産を活かせるよう、そしてJavaScriptコードとの相互運用性を高く保てるよう、よく考えられています。既存のJavaScript資産をTypeScriptでも使えるよう、型定義ファイルがコミュニティの手で作られていますよね。品質に多少の問題があるので賛否両論ではありますが、コミュニティの力が発揮された素晴らしい成果だと思います。詳しい話題に踏み込みましょうか。Subtypingを採用しているのが特徴です。これは、型の同一性を型の名前ではなく、型の構造だけで判断するというものです。xとyというメンバーを持つPoint2Dというインターフェースと、それを引数として受け取るメソッドがあったとします。そのメソッドに渡すオブジェクトは、xとyというメンバーを持ってさえいれば、Point2Dインターフェースを実装している必要はありません。ダック・タイピングの静的型付け版、みたいな感じですよね。今、インターフェースの話が出ましたが、TypeScriptにおけるユーザー定義型についても教えてください。TypeScriptでは、型を定義するのにクラス、インターフェース、Enum(列挙型)のような機能があります。ECMAScriptでも、6からはクラスを作れるようになりましたが、TypeScriptではより多くの機能を持ったクラスを使うことができます。アクセス修飾子を付けて、プロパティやメソッドの公開範囲を限定することができたり、readonlyキーワードを用いてイミュータブルなプロパティを作ることもできます。インターフェースはクラスが実装すべき規約を表すための機能です。implementsというキーワードでクラスに付与すると、インターフェースが持つメソッドやプロパティを実装しないとコンパイルできなくなります。TypeScriptのインターフェースはコンパイル時にのみ用いられます。出力されるJavaScriptコードには、インターフェースの情報は残りません。