TypeScript 1.5 で ES2015 の let const を ES5 でも使えるようになったので試してみます。

let

letvar と同じように変数を定義する構文です。

let a: number = 1;
console.log(a); // 1

当然 var と全く同じなわけではなく、スコープに違いがあります。

var x: number = 1;
let y: number = 1;

console.log(x, y); // 1 1

if (true) {
    var x: number = 2;
    let y: number = 2;
    console.log(x, y); // 2 2
}

console.log(x, y); // 2 1

varif の中で定義されたものに書き換わりますが、 letif の中と外で別の変数になっています。変換結果の JavaScript を見ると if の中で定義された yyt1 にリネームされていました。

これまで変数のスコープは関す単位でしたが、 let を使うことで気軽に iffor の中で一時変数を使えます。ただし for の中でクロージャを使うには target を ES6 にする必要があります。

// このプログラムは ES5 や ES3 向けだとコンパイル時エラー
for (let i = 0; i < 5; i++) {
    setTimeout(() => {
        console.log(i);
    }, 0);
}

const

const は定数を定義します。スコープは let と同じです。

const z: number = 1;

console.log(z); // 1

if (true) {
    let z: number = 2;
    console.log(z); // 2
}

console.log(z); // 1

書き換えようとするとコンパイル時エラーです。

const w: number = 1;
w = 2; // エラー

変換後の JavaScript を見ると var に変換されています。チェックはコンパイル時にされます。

ちなみに JavaScript エンジンが独自で const を実装していたりしましたが、スコープに関して挙動が変わっています。

export

letconstvar と同じように export できます。

export let x = 1;
export const y = 2;

--target ES5 --module commonjs というオプションで変換したところ次のようになりました。

exports.x = 1;
exports.y = 2;

残念ながら定数を Object.defineProperty を使って writable: false にしてくれたりはしないようです。

まとめ

  • let は変数を定義する
  • const は定数を定義する
  • letconst のスコープは var と異なる
  • TypeScript での変換結果は var になる