TypeScript を攻略する
この書籍をサポートしてください: 購入する寄付してください。
(広告、ブロックしないでください。)

11 最上位型 anyunknown



TypeScript では、anyunknown はすべての値を含む型です。この章では、それぞれが何であり、何に使用できるかを調べます。

11.1 TypeScript の 2 つの最上位型

anyunknown は TypeScript のいわゆる *最上位型* です。Wikipedia を引用します。

最上位型 […] は 普遍的型で、普遍的スーパークラス とも呼ばれます。その理由は、特定の型システム内の他のすべての型はサブクラスであること […] です。ほとんどの場合、利害関係の型システム内のすべて考えられる [値] を含む型です。

つまり、型を値の集合として見ると (型の詳細については [含まれるコンテンツではありません] を参照してください)、anyunknown はすべての値を含む集合です。補足すると、TypeScript には空集合である 最下位型 never もあります。

11.2 最上位型 any

値に型 any がある場合、どんなこともそれに対して行うことができます。

function func(value: any) {
  // Only allowed for numbers, but they are a subtype of `any`
  5 * value;

  // Normally the type signature of `value` must contain .propName
  value.propName;

  // Normally only allowed for Arrays and types with index signatures
  value[123];
}

あらゆる型が型 any に割り当て可能

let storageLocation: any;

storageLocation = null;
storageLocation = true;
storageLocation = {};

any はあらゆる型に割り当て可能

function func(value: any) {
  const a: null = value;
  const b: boolean = value;
  const c: object = value;
}

any を使用すると、TypeScript の静的な型システムから通常提供される保護が失われます。したがって、より具体的な型または unknown が使用できない場合にのみ、最後の手段として使用してください。

11.2.1 例: JSON.parse()

JSON.parse() の結果は動的な入力に依存するため、戻り値の型は any です。(シグネチャからパラメータ reviver は省略しました)

JSON.parse(text: string): any;

JSON.parse() は、型 unknown が存在する前に TypeScript に追加されました。そうでなければ、戻り値の型はおそらく unknown になっています。

11.2.2 例: String()

任意の値を文字列に変換する関数 String() の型シグネチャは次のとおりです。

interface StringConstructor {
  (value?: any): string; // call signature
  // ···
}

11.3 最上位型 unknown

unknown は型 any の型安全なバージョンです。any の利用を検討している場合、最初に unknown を検討してください。

any では何でもできますが、unknown ははるかに制限されています。

unknown の値に対して操作を実行する前に、まず次のようにして型を絞り込む必要があります。