😇

TypeScriptのany型とunknown型の違いについて

2023/06/18に公開

type-challengesを解いており、他の回答コードを確認していると、人によってany型を使ったり、unknown型を使っているケースがあり、any型とunknown型の違いをまとめました。

any型

みなさんがよく使う任意の型の場合に使います。

unknown型

unknown型はTypeScript3.0から導入され、「型安全なany型」と言われています。
そのため、他の型の値に代入することができないだけでなく、値のプロパティや関数を参照することすらできません。

const unknown: unknown = 1;
const stringValue: string = unknown; // Type 'unknown' is not assignable to type 'string'.
const numberValue: number = unknown; // Type 'unknown' is not assignable to type 'number'.
const unknown: unknownString = "unknown";
console.log(unknownString.length); // 'unknownString' is of type 'unknown'.

const unknownObject: unknown = { property: "unknown" };
console.log(unknownObject.property); // 'unknownObject' is of type 'unknown'.

any型と違って、オブジェクトのプロパティすらアクセスできないんですね...
ちなみに、型の絞り込みをすれば、安全に操作することができるようです。

function isNumberArray(value: unknown): value is number[] {
  if (!Array.isArray(value)) {
    return false;
  }
  // 配列型として操作することが可能
  return value.every((e) => typeof e === "number");
}

参考文献

Discussion