any型
どんな型でも受け入れるが、型チェックが行われないため安全性が低い。
メリット: 非常に柔軟で、どんな型でも扱えるため、プロトタイピングや型定義が未確定な場合に素早く実装できる。
デメリット: 型チェックが行われないため、意図しないエラーを引き起こしやすく、安全性が低い。
let value: any;
value = "hello"; // OK
value = 123; // OK
value = true; // OK
// any型なので何でもできる(型エラーなし)
value.toUpperCase(); // OK
value.foo(); // OK(エラーにならない)
unknown型
型が不明な値を保持するが、利用時には型チェックが必要。安全性が高い。
メリット: 型が不明な場合でも安全に操作できる。型チェックを強制することでコードの安全性を向上させる。
デメリット: 使用する前に型チェックが必要なため、コードが少し冗長になる可能性がある。
let value: unknown;
value = "hello"; // OK
value = 123; // OK
value = true; // OK
// そのままではエラー(型の保証がないため)
value.toUpperCase(); // エラー
value.foo(); // エラー
// 型チェックをすればOK
if (typeof value === "string") {
value.toUpperCase(); // OK
}
// 悪い例: anyを使ったケース
function handleApiResponse(response: any) {
console.log(response.name);
}
// 改善例: unknownを使ったケース
function handleApiResponse(response: unknown) {
if (typeof response === "object" && response !== null && "name" in response) {
console.log((response as { name: string }).name); // 型チェック後にプロパティにアクセスするため安全
} else {
console.log("無効なレスポンスです");
}
}
void型
関数が値を返さないことを示す。戻り値のない関数に使う。
メリット: 関数が値を返さないことを明示することで、コードの意図をはっきりさせることができる。
デメリット: 他の型と比べて使用の幅が狭く、特に関数の戻り値に限定される。
function logMessage(message: string): void {
console.log(message);
}
never 型
決して値を返さないことを示す。常に例外をスローする関数や無限ループに使う。
メリット: 到達不能なコードを明示することで、型システムを活用したバグの防止に役立つ。
デメリット: 非常に特殊なケースに限定されるため、意図して使う機会が少ない。
function infiniteLoop(): never {
while (true) {
console.log("ループ中...");
}
}
//この関数は処理が永久に続き、終了しないため never 型になる。
function processInput(value: string | number): void {
if (typeof value === "string") {
console.log("文字列です: " + value);
} else if (typeof value === "number") {
console.log("数値です: " + value);
} else {
const neverValue: never = value; // 型チェックの段階で、この行は到達不能であることを示す
console.log(neverValue);
}
}