🦾

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