unknown型とnever型はたまによく見ますが、それぞれがどのようなものなのかを理解していなかったので、この記事で整理したいと思います!
unknown型
unknown型はなんでも入れることができる型です。なんでも入れられる、つまり何が入っているかわからないことから、unknown型という名前になっているということですね。
function test(val: unknown) {
return val;
}
// 以下は全てOK!
test('test');
test(123);
test(true);
test({ rice: "お米"});
any型との違い
なんでも入れることができる、という点だとany型も同じのように思えますが、unknown型はany型と比べて安全です。
any型の値は、使う際に型のチェックが行われません。そのため、本当に持っているかわからないプロパティやメソッドにアクセスしようとしてもコンパイルエラーになりません。
function test(val: any) {
// エラーにならない!
const name = val.name;
const age = val.age;
const valLength = val.length;
return val;
}
test('test');
test(123);
test(true);
test({ rice: "お米"});
unknown型については「なんでも入れることができる型」として型のチェックが行われます。そのため、アクセスしようとしているプロパティやメソッドが本当に存在するのかについては慎重に判断してくれます。
function test(val: unknown) {
// Property 'name' does not exist on type 'unknown'.
const name = val.name;
// Property 'age' does not exist on type 'unknown'.
const age = val.age;
// Property 'length' does not exist on type 'unknown'.
const valLength = val.length;
return val;
}
test('test');
test(123);
test(true);
test({ rice: "お米"});
never型
never型は当てはまる値が存在しない型です。当てはまる値がないということは、never型が当てられている変数についてはどのような値も代入することができないということです。
また関数の引数をnever型にした場合、その関数は(anyなどを使わない限り)呼び出すことができなくなります。
function dontCall(val: never) {
// ユニークな仕様として、never型の値はどんな型にも代入できる
const srt: string = val;
const num: number = val;
const obj: object = val;
return val;
}
// 全てコンパイルエラーになる
dontCall({ rice: "お米" }); // Argument of type '{ rice: string; }' is not assignable to parameter of type 'never'.
dontCall("ご飯"); // Argument of type 'string' is not assignable to parameter of type 'never'.
終わりに
内容に間違いや誤字脱字等ございましたら、ご指摘いただけるとありがたいです!
読んでいただきありがとうございました!