🦾
TypeScriptのanyとunknown
何度も調べるので自分用メモとして、ざっくり見るように残しておく。
ざっくり
any
- 型を指定しない
- どんな操作もできる
- プロパティへのアクセス
- メソッド呼び出し
- 関数呼び出し
unknown
- 最初は型を指定しないので何でも受け付けるがチェックは必要
- unknownが指定された場合は、使用する前に型チェックやアサーションが必要
使い方
any
何を代入しても、型のエラーは出ない。
実行時にエラーになる可能性はある。
any
let valueAny: any = 10;
valueAny = "hello";
valueAny = true;
valueAny.foo(); // 実行時にはエラーになる可能性あり
let num: number = valueAny; // どの型にも代入可能
unknown
どんな型も受け付けるが、型チェックを行う
unknown
let valueUnknown: unknown = 10;
valueUnknown = "hello";
valueUnknown = true;
// valueUnknown.foo(); // コンパイルエラー!
// let num2: number = valueUnknown; // コンパイルエラー!
上記 foo()
を使うには以下のように型ガードによるチェックを行う必要がある。
unknown-object
if (
typeof valueUnknown === "object" && // objectである
valueUnknown !== null && // nullではない
"foo" in valueUnknown // foo関数が存在する
) {
valueUnknown.foo();
}
もう少し簡単に言うと、Stringの関数を使うのには、stringであることを確定させる必要がある。
unknown-string
const valueUnknown: unknown = "Hello";
if (typeof valueUnknown === "string") {
console.log(valueUnknown.toUpperCase());
}
Discussion