TypeScript:全体の仕様を把握する

まとまってる記事を探そう

 TyperScriptの言語仕様全体を確認するのにいい記事を見つけました。
 TypeScript早わかりチートシート - Build Insider
 細かい部分はプログラムを書いて確かめないとよくわかんなかったりしますが、かなりしっかりした記事のようです。

 TypeScript クイックガイド - phyzkit.netの方も、なかなか参考になります。

 あとは、当然本家のHandbook - Welcome to TypeScript、ですね。
 こちらの方が原典ですから、英語ですけど、ちゃんと当たっておきましょう。
 マイクロソフトは日本語ページも用意しているだろうと思ってたんですけど、どうやら英語だけみたいです。
 結局、まともな開発者は日本人でも英語ページしか見てない、ということに気づいてしまったんでしょうか。
 私のような、あんまりまともでない開発者のことも考えていただきたい(笑)

 で、入門記事としてInsider.NET > TypeScriptで学ぶJavaScript入門 - @ITをざっと読む。
 これ、現在、連載中です。
 JavaScript初級者向けの解説も多く、すでにJavaScript知っている人にとっては、冗長かもしれません。

ざっと仕様の特徴を

変数の型指定

 TyperScriptは、ざっくり言えば「型に厳密なJavaScript」と言えるかとおもいます。
 JavaScriptは(静的)型指定や宣言なしで、変数がほいっと使えちゃってお気楽ですが、少しプログラムが大きくなると、混乱の元にしかならないのが困ったところ。
 たぶんJavaScriptは、せいぜい100行程度のプログラムしか想定してなかったんではなかろうか。
 そのくらいだと、型指定とか無くても全体を把握できるしね。

 でも現在、JavaScriptはコードサイズがメガ単位みたいな世界へ突っ込んでいるので、とてもではないけど厳密な型指定なしでの運用は無理。
 ということでTypeScriptなどのaltJSは静的型指定ができるというのが、まず基本のようです。

 TypeScriptはコンパイル時に型チェックを行うので、実行前に基本的なバグが発見できて、開発の効率化がはかれるとういこと。
 これは、小・中・大規模開発とても良いこと。って全部やん。
 超小規模開発の場合は…いちいち使い分けるのが面倒だから、やっぱりTypeScriptで書けばいいんじゃないでしょうか(笑)
 今後、直接JavaScript書く場面って、ブラウザの挙動の確認にalertだけ一行書く、ぐらいしかなくなるのかもね。

var sample:number;

 とまぁ、こんな感じで。
 TypeScriptは基本的にECMAScript準拠なので、ActionScript3と同じ書き方で混乱がなくていいね。

オブジェクト定義

 型指定と同様に、一般的な オブジェクト指向言語的なクラス定義ができるようになっている、というところも大規模開発ではありがたい。
 JavaScriptもオブジェクト作れるんだけど、これもまた「ゆるーい」仕様で、それはそれで面白いんだけど、やはり大規模になると厳密さが大切。

 変数のスコープなんかも含めて、きっちりとカプセル化された仕様が求められる、というものです。
 変数にpublic(公開)とprivate(隠蔽)が指定できるようになって、なんでも外から見放題いじり放題というJavaScriptの融通無碍すぎる状況が改善されています。

 JavaScriptでのオブジェクトの作り方というのが、色々な書き方ができて、どれが正解なんだか不安なまま実装したり、複数の書式が混在して混乱したり、なんともはやな状況なわけなんですが、「クラス作るときはこう!」と決まっていることの安心感はとても良いものです。
 実際の話、どの書式が一番か試したり宗教論争したりすることにかかるコストは半端ないので、最初からそれしかできないとかベストな方法を提示してもらったほうが、なんぼありがたいことか。
 プログラミングでかけたいコストは、書式の選択にはないのです。もっと創造的な部分に労力を使いたいのです。

class Sampe extends SuperClass implements IInterface
{
	// コンストラクタ
	constructor( public arg:number ){
	}

	// メンバ関数
	public static mathod:( arg:number ):void {
	}
}

 publicやprivate、それにstaticによってスコープを指定できます。このへんActionScript3といっしょですね。
 他にget/setを使った属性(プロパティ)の実装方法も用意してあります。これはECMAScript5出力でないと使えません。
JavaScript側での定義に、defineProperty()関数を使っているからです。
 現在、tscのディフォルトターゲットはES3なので、オプションをES5以降に変えておく必要があります。

 constructorが予約語になってて、コンストラクタの表現が、ActionScript3とは若干異なります。
 このへん、元にしているECMAScriptのバージョンが異なるためなのかな。

 クラス内のメンバ関数の定義やクラス変数の定義では、いちいちfunctionとかvarとかつけなくていいのが気が利いています。
 こうなってくると、クラスの外でもつけなくてよいようにできないものか…とか思います。
 ただし、大規模開発になるとほとんどの関数はメンバ関数としてクラス内部に記述されることになるので、次に書いている無名関数のアロー表記(=>)と合わせて、事実上function廃止と言えるんじゃないでしょうか。

 継承関係ではインタフェースも定義できて、classにimplementsできます。
 interfaceは構造体的なObjectオブジェクトの定義としても使えて、そうやって定義したオブジェクトはちゃんと型チェックされます。

関数のアロー表記

 =>を使ってfunctionと書かなくても関数が書けるようになってます。
 以前からめちゃめちゃ頻出するのにfunctionは長いよ、てゆーかこれ書かなくても関数が書いてあるってわかるよね、functionって予約語、マジいらなくね? ってみんな思ってたはず。
 書き方は以下のような感じ。

var test = ( arg:string ):void=>{
	console.log( arg );
}

 以下と同じ。

var test = function( arg:string ):void{
	console.log( arg );
}

 あるいは以下。

function test( arg:string ):void{
	console.log( arg );
}

 三番目のやつと比べたら、アロー式にしてもたいしてタイプ数減らねーじゃねーかよ、って感じもありますが、イベントハンドラのように、既に用意されている関数に 中身を割り当てる場合なんかは、結構タイプ数が減ります。

btn.onclick = function() { alert("Hello"); };
btn.onclick = () => { alert("Hello"); };

 functionが =>になるんですから1/4文字と、かなりの減りっぷりですね。
 いちいちfunctionをタイプせずに、エディタに関数を記述するスニペットを書いて、ショートカットキー割り当てろ、という話ではあるんですが。
 ちなみにfunctionと=>記法による関数の機能は、完全に一緒ではなく、thisの扱いが異なったりするみたいです。

新しい言語機能

 enum、ジェネリックなどといった新しい言語機能が多数追加されています。
 新しい、とか言っても、もう多くの言語で定着してる感あります。
 しかし、私個人はあまり馴染みがない機能なので、これを機に馴染んでいこうと思います。

型定義ファイル

 既存のjQueryとかのライブラリをTypeScriptから使うには、型定義ファイルが別途必要となります。
 なんで、そんなのが必要かというと、ライブラリは従来のJavaScriptで作られているので変数や引数に型がない、でもTypeScriptには厳密な型があるので、そのまま使うと折角の型付け言語のメリットが減っちゃう、ということで既存のライブラリに型を定義してやって、TypeScript的に自然な状態で使おう、ということみたい。

 で、その型定義ファイルはborisyankov/DefinitelyTyped · GitHubに集積されているので、使いたいライブラリ名で検索して、見つかったやつを使えばよろしい、ということ。
 まーしかし、ここでもGitHubですね。全てのコードはGitHubに集まるのか。

エディタはどうしよう

 WebStormが良いとか聞くけど、とりあえず手に馴染んでいるmiで開発していくことにします。

 しかし、問題はとくに何を作るかという目標がないということと、TypeScriptの仕様よりもJavaScriptで使えるcanvasとかの機能の理解が先だったんじゃないか、という気がする。

 今日はここまで。