any
-
役割: any 型は TypeScript の型システムの一部を無効にするものです。変数が any 型の場合、その変数に対して任意の操作を行うことができ、コンパイラはそれをチェックしません。
-
主な使用ケース: 既存の JavaScript コードを TypeScript に移行する場合や、他のライブラリやフレームワークとの互換性を持つために一時的に型チェックをスキップしたい場面で使用されます。
-
リスク: any 型を使用すると、型の安全性が失われ、ランタイムエラーの原因となる可能性があります。
unknown
-
役割: unknown 型は最も厳格な型として考えられます。unknown 型の変数は存在は確定していますが、その型が何であるかは不明です。したがって、unknown 型の変数を直接操作することはできず、その型を具体的に確定させる必要があります。
-
主な使用ケース: 外部のライブラリや API からのデータなど、型が不明確なものを扱う場面で使用されます。unknown 型を使用すると、データを使用する前に型を確認・確定することが強制され、安全にコードを書くことができます。
-
安全性: unknown は型の安全性を高めるものです。unknown 型の変数を操作する前に、その変数の型を確定させる必要があります。
any の例
let dataAny: any;
dataAny = "Hello";
console.log(dataAny.toUpperCase()); // "HELLO"
dataAny = 42;
console.log(dataAny.toFixed(2)); // "42.00"
// any型なので、存在しないメソッドを呼び出してもコンパイルエラーにならない
// しかし、実行時にはエラーが発生する
console.log(dataAny.notExistingMethod());
上記の例では、dataAny は any 型なので、文字列メソッドや数値メソッドを問題なく呼び出すことができます。しかし、存在しないメソッドを呼び出しても、コンパイル時にエラーが発生しないというリスクがあります。
unknown の例
let dataUnknown: unknown;
dataUnknown = "Hello";
// 直接文字列メソッドを呼び出すことはできない
// console.log(dataUnknown.toUpperCase()); // エラー
if (typeof dataUnknown === "string") {
console.log(dataUnknown.toUpperCase()); // "HELLO"
}
dataUnknown = 42;
// 直接数値メソッドを呼び出すことはできない
// console.log(dataUnknown.toFixed(2)); // エラー
if (typeof dataUnknown === "number") {
console.log(dataUnknown.toFixed(2)); // "42.00"
}
上記の例では、dataUnknown は unknown 型なので、型を確認しないとメソッドを呼び出すことはできません。したがって、typeof を使用して型をチェックすることで、メソッドを安全に呼び出すことができます。
まとめ
- any は型の制約を無視し、どんなメソッドやプロパティへのアクセスも許可します。しかし、これにはランタイムエラーを引き起こすリスクが伴います。
- unknown は型が不明なデータを表現します。このデータを利用する前に、その型を確認・確定する必要があります。これにより、コードの安全性が高まります。