TypeScript 1.5 で ES2015 の let
const
を ES5 でも使えるようになったので試してみます。
let
let
は var
と同じように変数を定義する構文です。
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
var
は if
の中で定義されたものに書き換わりますが、 let
は if
の中と外で別の変数になっています。変換結果の JavaScript を見ると if
の中で定義された y
は yt1
にリネームされていました。
これまで変数のスコープは関す単位でしたが、 let
を使うことで気軽に if
や for
の中で一時変数を使えます。ただし 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
let
と const
は var
と同じように 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
は定数を定義するlet
とconst
のスコープはvar
と異なる- TypeScript での変換結果は
var
になる