TypeScriptはJavaScriptのすべての機能を持ち、その上に追加機能を加えた人気のあるプログラミング言語です。TypeScriptの主な特徴の一つとして、静的型付けをサポートしていることが挙げられます。これは、変数や式が宣言されるときに、その型を指定することができることを意味します。
TypeScriptでは、変数や式を宣言するために、いくつかのプリミティブ型が用意されています。
プリミティブ型とは、他の型から派生していない、基本的な値を表すデータ型です。言い換えれば、プリミティブ型はプログラミング言語で利用できる最も基本的なデータ型であり、通常、数値、文字列、ブール値などの単純な値を表現するために使用されます。
Note: プリミティブ型は、他のデータ型から構成されたデータ型である複合型と対比されます。例えば、配列は複数の要素から構成される複合型であり、オブジェクトはプロパティの集合から構成される複合型として知られています。
TypeScriptにおいて、上記のプリミティブ型以外はオブジェクトになります。
TypeScriptでは、ブーリアン型は真偽値を表現するために使われます。ブーリアン型は、比較の結果やif文の条件など、真か偽のどちらかになりうる値を表すのによく使われます。
let isTrue: boolean = true;
let isFalse: boolean = false;
ブーリアン型は比較演算子と共に使うことができます。
let isTrue: boolean = true;
let isFalse: boolean = false;
console.log(isTrue === isFalse) // false
console.log(isTrue !== isFalse) // true
console.log(5 > 3) // true
ブーリアン型はif文で頻繁に用いられます。
let isTrue: boolean = true;
let isFalse: boolean = false;
if (isTrue) {
// このコードは、isTrueの値がtrueなので実行されます
console.log('The value is true');
}
if (isFalse) {
// isFalse'の値がfalseなので、このコードは実行されません
console.log('The value is true');
}
条件付き三項演算子でも使われます。以下の例では、x > yがfalseと評価され、変数maxにyが代入されます。仮にxが30であれば、30 > 20はtrueと評価され、変数maxにxが代入されます。
let x: number = 10;
let y: number = 20;
let max: number = x > y ? x : y;
console.log(max); // 20
TypeScriptでは、数値を表現するためにnumber型が使用されます。TypeScriptのJavaScriptのnumber型に相当し、整数値も浮動小数点値も表現できます。number型は64ビットの浮動小数点数で、一般的には、数、量、測定値などの値を表現するために使用されます。
以下のa〜gはいずれも数値型として認識されます。
let a: number = 100;
let b: number = 10;
let c: number = 10.5; // 小数
let d: number = .5 // 小数
let e: number = -100; // 負の数
let f: number = Infinity; // 無限大
let g: number = parseInt('ゼロ'); // NaN
上記の例では、変数はすべてnumber型で宣言され、整数値や浮動小数点値で初期化されています。
四則演算は以下のようになります。
console.log(100 + 10) // 110
console.log(100 - 10) // 90
console.log(100 * 10) // 1000
console.log(100 / 10) // 10
文字列はダブルクォートまたはシングルクォートで囲われて表現されます。Javaなどとは異なり、ダブルクォートとシングルクォートによる違いはありません。
let myString: string = 'Hello, World!';
バッククォートを使用した場合も文字列型になります。バッククォートで囲んだ使用した文字列はテンプレートリテラルと呼ばれ、式の挿入や改行を行うことができます。テンプレートリテラルを使うことで、${ }で囲むことで文字列の中に変数や式を含めることができます。
let myName: string = 'John';
let greeting: string = `Hello, ${myName}!`; // Hello, John!
上記のコードでは、変数greetingに"Hello, John!"という値が代入されます。
また、文字列はプリミティブ型の中では少し特殊でメソッドを持っているものとした扱いをすることが可能です。これはプリミティブの文字列に対してメソッドの呼び出し等を行おうとした際に、自動的にStringオブジェクトでラップされるためにこのような挙動が起こります。
let myString: string = 'Hello, World!';
console.log(myString.toUpperCase()); // "HELLO, WORLD!"
ここでは、プリミティブな文字列である変数myStringに対してtoUpperCase()メソッドを呼び出しています。TypeScriptでは、プリミティブな文字列に対してメソッドを呼び出すことができ、型システムはそれをStringオブジェクトであるかのように扱います。しかし、明示的にStringオブジェクトを作成したい場合は、Stringコンストラクタを使用して作成することができます。
let myString: String = new String('Hello, World!');
console.log(myString.toUpperCase()); // "HELLO, WORLD!"
メソッドの例としては、以下のようなものが挙げられます。
数値型が表すことができる253よりも大きな整数を表すことができるプリミティブ型です。bigint型は数値型のリテラルの末尾にnをつけて表現します。bigintリテラルをTypeScriptで用いるには、コンパイラオプションのtargetをes2020以上にする必要である点には注意しましょう。
let myBigInt: bigint = 12345678901234567890n;
BigIntコンストラクタを使ってbigint値を生成することもできます。BigIntコンストラクタは、文字列または数値を引数として受け取り、bigint値を返します。
let myBigInt: bigint = BigInt(12345678901234567890);
let stringBigInt: bigint = BigInt('12345678901234567890');
bigint値を取得すると、通常の算術演算子(+、-、*、/、%など)を使って、その値に対して演算を実行することができます。ただし、bigint値は他のbigint値としか使用できず、数値の値とは使用できないことに注意してください。
let a: bigint = 12345678901234567890n;
let b: bigint = 9876543210n;
let c: bigint = a + b; // c is 12345768576778899000n
bigint値は任意の精度で整数を表現するために設計されています。つまり、非常に大きな数を表現することはできますが、非常に小さな数を表現することはできません。つまり、分数や小数のような整数でない値を表現することはできません。
TypeScriptでは、シンボル型型は一意で不変な値を表します。文字列、数値、ブーリアンなどと同様にプリミティブなデータ型です。シンボルの値はSymbolコンストラクタで生成されます。
let mySymbol: symbol = Symbol();
また、シンボルのコンストラクタに値を渡すこともできます。デバッグやシンボルを識別するのに便利な場合があります。
シンボル値は一意で不変なので、2つのシンボル値が同じオブジェクトを参照している場合にのみ、等しいとみなされます。
let sym1: symbol = Symbol();
let sym2: symbol = Symbol();
console.log(sym1 === sym2); // false
上記の例では、sym1とsym2は同じ名前でも異なるシンボル値です。constキーワードを使用すると、特定のシンボル値として明示的に型付けされた定数を作成することができます。
const MY_SYMBOL: symbol = Symbol();
const YOUR_SYMBOL: symbol = Symbol();
シンボル値は、主にオブジェクトのユニークなプロパティキーとして使用されます。シンボル値は一意で不変なので、他のコードからアクセスまたは変更できないオブジェクトのプロパティを作成するために使用することができます。
const key1 = Symbol('key1');
const key2 = Symbol('key2');
let obj = {
[key1]: 'value1',
[key2]: 'value2',
key3: 'value3'
};
console.log(obj[key1]); // "value1"
console.log(obj[key2]); // "value2"
console.log(obj.key3); // "value3"
obj[Symbol('key1')] = 'new value';
console.log(obj[key1]); // "value1"
上の例では、objは3つのプロパティを持っています。Symbol('key1'), Symbol('key2'), key3です。最初の2つのプロパティはキーとしてシンボル値を使用し、3番目のプロパティはキーとして文字列を使用します。
文字列をキーとするプロパティは、通常のドット記法やブラケット記法でアクセスや変更が可能ですが、シンボルをキーとするプロパティは、シンボル値を用いたブラケット記法でしかアクセスできません。
また、シンボル値は一意であるため、他のコードがシンボル値を用いてシンボルキーやプロパティにアクセスし、変更することはできません。
nullとundefinedはあるものの欠如を表す値です。ヌル型はnull、undefined型はundefinedという一つの値だけ取ります。その二つは区別せずに使用されることが多いですが、多少の違いは存在します。
また、undefinedに関しては以下のように初期値がない変数や配列がない要素にアクセスした際に自動的にundefinedになります。
let number;
console.log(number); // undefined
let array = [];
console.log(array[0]); // undefined
nullに関しては意図的に使用する場合が多いです。
let value = null;
console.log(value) // null
Note: プリミティブ型については、CS基礎/初級/プリミティブ型で詳しく学習できます。