TypeScript の練習その１

## 概要
チュートリアルをこなして TypeScript を学ぶ。TypeScript は Delphi、C# の生みの親であるアンダース・ヘルスバーグ氏が開発に関わっているので期待大。

ここで挙げるコードは [Tutorial - Welcome to TypeScript](http://www.typescriptlang.org/Tutorial) にあるものを練習がてら手書きしたものですのであしからず。

## ステップ１
```ts:tutorial_01.ts
function greeter(person) {
    return "Hello, " + person;
}

var user = "Jane User";

document.body.innerHTML = greeter(user);
```

### コンパイル・実行結果
`tsc tutorial_01.ts`でコンパイルすると、エラーなしで tutorial_01.js が生成される。

### ここから分かったこと
 1. TypeScript は JavaScript のスーパーセットなので JavaScript のままでも書ける
 2. 生成された tutorial_01.js は tutorial_01.ts と全く同じ内容になる

## ステップ２
user 変数を文字列から配列に変更。

```ts:tutorial_02.ts
function greeter(person) {
    return "Hello, " + person;
}

var user = [0, 1, 2];

document.body.innerHTML = greeter(user);
```

### コンパイル・実行結果
`tsc tutorial_02.ts`でコンパイルすると、エラーなしで tutorial_02.js が生成される。しかし、文字列と配列は足し算できないので実行時エラーになる。

### ここから分かったこと
 1. TypeScript でも型を指定しないと不正な型指定をコンパイル時に検出してくれない

## ステップ３
greeter 関数の person 引数に型として string を指定。

```ts:tutorial_03.ts
function greeter(person: string) {
    return "Hello, " + person;
}

var user = [0, 1, 2];

document.body.innerHTML = greeter(user);
```

### コンパイル・実行結果
`tsc tutorial_03.ts`でコンパイルすると、以下のエラーがでるが、tutorial_03.js は生成される。
```
tutorial_03.ts(7,27): error TS2082: Supplied parameters do not match any signature of call target:
	Could not apply type 'string' to argument 1 which is of type 'number[]'.
tutorial_03.ts(7,27): error TS2087: Could not select overload for 'call' expression.
```

```js:tutorial_03.js
function greeter(person) {
    return "Hello, " + person;
}

var user = [0, 1, 2];

document.body.innerHTML = greeter(user);
```

### ここから分かったこと
 1. TypeScript では型指定しておけば不正な型指定をコンパイル時に検出してくれる
 2. コンパイルエラーが出ても JavaScript は生成されるので注意が必要
 3. 生成された JavaScript からは型情報が取り除かれる

## ステップ４
Person という interface を定義し、greeter 関数の person 引数に型として Person を指定。

```ts:tutorial_04.ts
interface Person {
	firstname: string;
	lastname: string;
}

function greeter(person: Person) {
	return "Hello, " + person.firstname + " " + person.lastname;
}

var user = { firstname: "Jane", lastname: "User" };

document.body.innerHTML = greeter(user);
```

### コンパイル・実行結果
`tsc tutorial_04.ts`でコンパイルすると、エラーなしで tutorial_04.js が生成される。

```js:tutorial_04.js
function greeter(person) {
    return "Hello, " + person.firstname + " " + person.lastname;
}

var user = { firstname: "Jane", lastname: "User" };

document.body.innerHTML = greeter(user);
```

### ここから分かったこと
 1. interface を使うとある形をしたオブジェクトに別名を付けてそれを型として扱うことができるらしい
 2. interface は生成された JavaScipt からは取り除かれる
 3. interface を使うと型情報を元にコード補完が効くようになる

## ステップ５
Student クラスを定義して、user 変数にそのインスタンスを指定する。

```ts:tutorial_05.js
class Student {
	fullname: string;

	constructor(public firstname, public middleinitial, public lastname) {
		this.fullname = firstname + " " + middleinitial + " " + lastname;
	}
}

interface Person {
	firstname: string;
	lastname: string;
}

function greeter(person: Person) {
	return "Hello, " + person.firstname + " " + person.lastname;
}

var user = new Student("Jane", "M.", "User");

document.body.innerHTML = greeter(user);
```

### コンパイル・実行結果
`tsc tutorial_05.ts`でコンパイルすると、エラーなしで tutorial_05.js が生成される。

```js:tutorial_05.js
var Student = (function () {
    function Student(firstname, middleinitial, lastname) {
        this.firstname = firstname;
        this.middleinitial = middleinitial;
        this.lastname = lastname;
        this.fullname = firstname + " " + middleinitial + " " + lastname;
    }
    return Student;
})();

function greeter(person) {
    return "Hello, " + person.firstname + " " + person.lastname;
}

var user = new Student("Jane", "M.", "User");

document.body.innerHTML = greeter(user);
```

### ここから分かったこと
 1. TypeScript では class は class として宣言できる
 2. コンストラクタは constructor と書く
 3. コンストラクタの引数に public をつけると自動的に public フィールドとして扱われる
 4. class は JavaScript が解釈できる形に変換される
 5. Student は Person を継承していないが、Person で定義される宣言を Student も満たしているのでコンパイルエラーにならないし実行時エラーにもならない

## 練習結果
 1. TypeScript ではまともなコード補完が効くので IDE が欲しくなる
    2. Eclipse にプラグインを入れて試したがそこそこいい感じ
 2. `tsc`によるコンパイルには思ったより時間がかかる
 3. C/C++、Java などのコンパイル型言語開発になれている場合、JavaScript ではなんとなく不安を感じるが TypeScript ではそれをある程度払拭できる

## 参考資料
 1. [Tutorial - Welcome to TypeScript](http://www.typescriptlang.org/Tutorial)
 2. [TypeScript - Wikipedia](http://ja.wikipedia.org/wiki/TypeScript)
 3. [TypeScript クイックガイド - phyzkit.net](http://phyzkit.net/typescript/) 
 4. [palantir/eclipse-typescript](https://github.com/palantir/eclipse-typescript)

## コード置き場
 - https://github.com/okumura/typescript-tutorial