JavaScriptでの開発経験がある皆様、TypeScriptの世界へようこそ。 第1章では環境構築を行いましたが、本章からいよいよ具体的なコードを書いていきます。
TypeScriptの最大の武器は「型(Type)」です。しかし、すべてのコードに手動で型を書く必要はありません。TypeScriptは非常に賢い「型推論」という機能を持っており、JavaScriptを書く感覚のまま、安全性を享受できる場面も多々あります。
この章では、基礎となるプリミティブ型、TypeScriptならではの配列やタプルの扱い、そして「何でもあり」な状態をどう制御するかについて学びます。
変数を宣言する際、その変数がどのような種類のデータを扱うかを明示することを「型注釈(Type Annotation)」と呼びます。
構文は非常にシンプルで、変数名の後ろに : 型名 を記述します。
// 文字列型の変数を宣言
let message: string = "Hello, TypeScript!";
// 数値型の定数を宣言
const userId: number = 1001;
// コンソールに出力
console.log(message);
console.log(`User ID: ${userId}`);
// エラーになる例(コメントアウトを外すとエディタ上で赤線が出ます)
// message = 123; // Error: Type 'number' is not assignable to type 'string'.npx tsc annotation.ts && node annotation.jsHello, TypeScript! User ID: 1001
ポイント: JavaScriptでは変数にどんな値でも再代入できましたが、TypeScriptでは宣言された型と異なる値を代入しようとすると、コンパイルエラー(またはエディタ上の警告)が発生します。これがバグを未然に防ぐ第一の砦です。
JavaScriptでおなじみのプリミティブ型は、TypeScriptでもそのまま使用できます。
"hello", 'world', `template`)NaN, Infinity すべて含む)true, false)注意点として、NumberやString(大文字始まり)はラッパーオブジェクト型を指すため、通常は小文字のnumber, stringを使用してください。
let isDone: boolean = false;
let decimal: number = 6;
let hex: number = 0xf00d;
let color: string = "blue";
// テンプレートリテラルもstring型として扱われます
let summary: string = `Color is ${color} and Hex is ${hex}`;
console.log("Is Done:", isDone);
console.log(summary);npx tsc primitives.ts && node primitives.jsIs Done: false Color is blue and Hex is 61453
ここがJavaScript経験者にとって嬉しいポイントです。 変数の初期化と同時に値を代入する場合、型注釈を省略してもTypeScriptが自動的に型を判別してくれます。これを「型推論」と呼びます。
// 型注釈がないが、"TypeScript"という文字列から string型 と推論される
let techName = "TypeScript";
// 数値が入っているため、count は number型 と推論される
let count = 42;
console.log(`Technology: ${techName}, Count: ${count}`);
// 推論された型と違う値を入れようとするとエラーになる
// count = "Forty-Two"; // Error!npx tsc inference.ts && node inference.jsTechnology: TypeScript, Count: 42
ベストプラクティス: 初期値がある場合、わざわざ
: stringなどを書く必要はありません。コードが冗長になるのを防ぐため、明示的な型注釈は「初期値がない場合」や「推論される型とは別の型として扱いたい場合」に使用するのが一般的です。
TypeScriptには「特定のデータ型」ではない特殊な型が存在します。これらは安全性に大きく関わるため、違いを理解することが重要です。
any 型は、型チェックを無効にする型です。JavaScriptと同じ挙動になりますが、TypeScriptを使うメリットが失われるため、可能な限り使用を避けてください。
「何が入ってくるかわからない」場合(例:外部APIのレスポンスなど)は、anyの代わりにunknownを使います。unknown型の変数は、「型の絞り込み(Type Narrowing)」を行わない限り、プロパティへのアクセスやメソッドの呼び出しができません。
never は「値を持たない」ことを意味します。常に例外を投げる関数や、無限ループなど「終了しない関数」の戻り値として使われます。
// --- any の例 ---
let looseVariable: any = 4;
looseVariable = "Maybe a string instead";
looseVariable = false; // エラーにならない(危険!)
console.log("Any:", looseVariable);
// --- unknown の例 ---
let uncertainValue: unknown = "I am actually a string";
// uncertainValue.toUpperCase(); // エラー: Object is of type 'unknown'.
// 型チェック(絞り込み)を行うと使用可能になる
if (typeof uncertainValue === "string") {
console.log("Unknown (checked):", uncertainValue.toUpperCase());
}
// --- never の例 ---
function throwError(message: string): never {
throw new Error(message);
}
try {
// この関数は決して正常に戻らない
throwError("Something went wrong");
} catch (e) {
console.log("Error caught");
}npx tsc special_types.ts && node special_types.jsAny: false Unknown (checked): I AM ACTUALLY A STRING Error caught
データの集合を扱う方法を見ていきましょう。
配列の型定義には2通りの書き方があります。
型[] (推奨:シンプル)Array<型> (ジェネリクス記法)配列に似ていますが、「要素の数が固定」で、「各要素の型が決まっている」ものをタプルと呼びます。CSVの1行や、座標(x, y)などを表現するのに便利です。
// --- 配列 ---
// 数値の配列
let fibonacci: number[] = [1, 1, 2, 3, 5];
// 文字列の配列(Array<T>記法)
let frameworkList: Array<string> = ["React", "Vue", "Angular"];
// --- タプル ---
// [名前, 年齢, 有効フラグ] の順序と型を守る必要がある
let userTuple: [string, number, boolean];
userTuple = ["Alice", 30, true];
// userTuple = [30, "Alice", true]; // エラー: 型の順序が違う
console.log("First Framework:", frameworkList[0]);
console.log(`User: ${userTuple[0]}, Age: ${userTuple[1]}`);
// fibonacci.push("8"); // エラー: number[] に string は追加できない
fibonacci.push(8); // OK
console.log("Next Fib:", fibonacci[fibonacci.length - 1]);npx tsc arrays_tuples.ts && node arrays_tuples.jsFirst Framework: React User: Alice, Age: 30 Next Fib: 8
: 型名 で型注釈をつけることができる。
string, number, boolean を小文字で使う。any は型チェックを無効にするため避け、不明な値には unknown を使う。次回は、より複雑なデータ構造を扱うための「オブジェクト、インターフェース、型エイリアス」について学びます。
product を定義し、["Keyboard", 5000] を代入してください。tags を定義し、型推論を使って ["IT", "Gadget"] で初期化してください。tags に新しいタグ "Sale" を追加してください。npx tsc practice2_1.ts && node practice2_1.jsunknown 型の引数 input を受け取る関数 printLength を作成してください。input が string 型である場合のみ、その文字列の長さをコンソールに出力してください(input.length)。input が string 以外の場合は、「Not a string」と出力してください。"TypeScript" と 数値 100 を渡して実行してください。npx tsc practice2_2.ts && node practice2_2.js