number - TypeScriptキーワード一覧
スポンサーリンク
「number」は基本型(プリミティブ型)の1つである「数値型」として用いられます。
概要
(特筆の無いものは TypeScript/spec.md 「3.2.1 The Number Type」での定義によります。)
- (型としての)キーワード「number」(または「number 型」)は『Numberプリミティブ型』を表します。
- 『Numberプリミティブ型』(以下「number 型」)は64ビットの倍精度浮動小数点数(IEEE 754)の値を表す型です。(ES2015 の仕様)
0
や12.375
などの「数値リテラル」データを number 型の変数への書き込みとして利用できます。- 「数値リテラル」を「型」として扱った場合は、それらは number 型の部分型(subtype)として扱われ、number 型のデータに代入することができます。(TypeScript PR #9407)
- number 型は(型としては)グローバルにあるインターフェイス「Number」型と同じプロパティーを持つオブジェクト型として扱われます。
- 値としては、内部処理「ToObject」が行われたときに「Number」のオブジェクトとして変換されます。(ES2015 の仕様)
- 式の結果が number 型の値であった場合、その式に対する
typeof
の結果は"number"
となります。(ES2015 の仕様)typeof x === "number"
という構文を用いると、その条件(型ガード; type guard)下で実行されるコードにおいて x が number 型として扱われるようになります。(「4.24 Type Guards」)
キーワード情報
- 「number」は識別子としては予約されていません。(ユーザー定義の識別子として利用できます。)
- 「number」は型名として予約されています。(ユーザー定義の型名として利用できません。)
詳細
number 型はプログラム上で「数値」を扱う基本的な型として利用されます。倍精度浮動小数点数(俗に「double」)として加減乗除などに利用できます。
let x: number; // number 型変数
x = 23; // 数値リテラルのデータは number 型として扱われるので number 型変数に代入可能
x = 4.5 * x; // number 型同士の算術演算の結果は number 型
let y: 3 = 3; // 数値リテラル「3」は型として使え、number 型変数としても扱える
let z = y.toFixedString(); // 「Number」型のプロパティー(メソッド)が使用できる
※ NaN および Infinity は、いずれもES2015の仕様における number 型のグローバルプロパティー値(それぞれ「NaN」値と「+∞」値を持つ定数)として定義されており、数値リテラルではありません。そのため、number 型の値としては利用できますが「NaN」などをそのまま「型」としては利用できません。
なお、number 型はグローバルの「Number」型として扱うことは出来ますが、「Number」型は number 型として使用することができません。また、「Number」型の変数に number 型データを代入しても実体は「Number」オブジェクトのデータではなくあくまで number 型データであるため、「instanceof Number」で検出することは出来ません。そのため、特別な理由が無い限りは「Number」型やそのオブジェクトを利用するのではなく number 型を利用するのが推奨されます。(関数としての「Number」の利用や、「Number」自身に存在するプロパティー(スタティックフィールド)を利用するのは問題ありません。)
let p = Number(31); // 「Number 関数」の戻り値は number 型
let q = new Number(62); // 「Number」オブジェクトの作成(「Number」型)
let r = p * q; // ERROR: TS2363: 算術演算に使えるのは number 型か any 型のみ
let s: Number | null; // 「Number」型または null 型として定義(strictNullChecksが有効の場合)
if (process.env.NODE_ENV === 'DEVELOPMENT') {
s = 12345;
} else {
s = null;
}
// 「Number」型かどうかののチェック
if (s instanceof Number) {
// (型解析上は s は Number になるが実際にはここに入らない)
console.log('Number', s);
} else {
// (型解析上は s は null になるが実際には数値である場合もここに入る)
console.log('null', s);
}
number 型かどうかは typeof x === "number"
でチェックできます。また、この式は以下のように型ガード(type guard)としても利用できます。
let unk: any; // 型が不明な変数
.
.
.
if (typeof unk === 'number') {
// このブロックでは unk を number 型の変数として扱える
console.log(unk * unk);
}
※ 「Number」型は内部的にはオブジェクトであるため、x が「Number」型であるとき typeof x === "number"
は false になります。