TypeScriptの型システム
TypeScriptは、JavaScriptに静的型付けを追加したオープンソースのプログラミング言語です。型システムを導入することで、コードの安全性と可読性が向上し、バグの発生を未然に防ぐことができます。
基本的な型
プリミティブ型
TypeScriptは、JavaScriptの基本的なデータ型をサポートしています。
- string: 文字列型
- number: 数値型
- boolean: 真偽値型
- null: null型
- undefined: undefined型
let username: string = "John";
let age: number = 30;
let isActive: boolean = true;
let empty: null = null;
let notDefined: undefined = undefined;
配列型
配列型は、同じ型の要素を持つ配列を定義するために使用します。
let numbers: number[] = [1, 2, 3, 4, 5];
let strings: string[] = ["apple", "banana", "cherry"];
タプル型
タプル型は、固定長の配列を定義し、各要素に異なる型を指定することができます。
let person: [string, number] = ["Alice", 25];
列挙型
列挙型(enum)は、名前付き定数の集合を定義するために使用します。
enum Color {
Red,
Green,
Blue
}
let favoriteColor: Color = Color.Green;
オブジェクト型
オブジェクト型は、オブジェクトの構造を定義するために使用します。
interface User {
name: string;
age: number;
isActive: boolean;
}
let user: User = {
name: "Bob",
age: 28,
isActive: true
};
関数型
関数型は、関数の引数と戻り値の型を定義するために使用します。
function add(a: number, b: number): number {
return a + b;
}
let subtract: (a: number, b: number) => number = (a, b) => a - b;
ユニオン型と交差型
ユニオン型
ユニオン型は、複数の型のいずれかを受け入れることができる型を定義します。
let value: string | number;
value = "Hello";
value = 42;
交差型
交差型は、複数の型を組み合わせて新しい型を定義します。
interface Person {
name: string;
}
interface Employee {
employeeId: number;
}
type EmployeePerson = Person & Employee;
let employee: EmployeePerson = {
name: "Charlie",
employeeId: 1234
};
型エイリアス
型エイリアスは、型に別名を付けるために使用します。
type StringOrNumber = string | number;
let value: StringOrNumber;
value = "Hello";
value = 42;
型ガード
型ガードは、ランタイムで型をチェックし、特定の型に基づいた処理を行うために使用します。
function isString(value: any): value is string {
return typeof value === "string";
}
function printValue(value: string | number) {
if (isString(value)) {
console.log(`String: ${value}`);
} else {
console.log(`Number: ${value}`);
}
}
ジェネリクス
ジェネリクスは、型をパラメータとして受け取ることができる汎用的な関数やクラスを定義するために使用します。
function identity<T>(value: T): T {
return value;
}
let stringIdentity = identity<string>("Hello");
let numberIdentity = identity<number>(42);
高度な型
インデックス型
インデックス型は、オブジェクトのプロパティの型を動的に取得するために使用します。
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person; // "name" | "age"
マップ型
マップ型は、既存の型を基に新しい型を生成するために使用します。
interface Person {
name: string;
age: number;
}
type ReadonlyPerson = {
readonly [K in keyof Person]: Person[K];
};
let person: ReadonlyPerson = {
name: "Dave",
age: 30
};
// person.name = "Eve"; // エラー: ReadonlyPersonのプロパティは読み取り専用です
まとめ
TypeScriptの型システムは、コードの安全性と可読性を大幅に向上させる強力なツールです。基本的なプリミティブ型から高度なジェネリクスやマップ型まで、さまざまな型を活用することで、より堅牢で保守性の高いコードを書くことができます。
普段Javaエンジニアとして働いているので型があると安心します。TypeScriptの型安全最高!!