この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:爽健
更新日時:2026-06-11 07:29:05

タイトル: Any (全ての型を許容)
SEOタイトル: TypeScript any 型 完全ガイド(型チェック無効化 / unknown との違い / 使うべきでない理由 / noImplicitAny)

この記事の要点
  • any 型は TypeScript の型チェックを無効化する特殊な型。あらゆる値を代入可、あらゆる操作が許可される
  • JavaScript からの移行用の脱出ハッチとして用意されたが、本格運用では極力使わないのが鉄則
  • unknown 型は any の安全な代替 — 受け取りは自由、使う前に型ガードを強制される
  • コンパイラオプション noImplicitAny を有効にして、暗黙の any をエラーとして検出する
  • 段階的移行: 一時的に any → 型を絞り込む → unknown → 具体型 のステップが定番

any 型とは

any 型は TypeScript における型チェックを無効化する特殊な型です。any として宣言された変数は、どんな値の代入も許され、どんなプロパティアクセスや関数呼び出しも (コンパイル時に) 許可されます。

つまり、TypeScript のメリットである型安全性を捨てる選択。短期的にはコンパイルエラーを消せて便利ですが、長期的にはバグの温床になります。

基本構文

let notSure: any = 4;
notSure = "maybe a string instead";   // OK
notSure = false;                      // OK (boolean)
notSure = { a: 1 };                   // OK (object)
notSure = [1, 2, 3];                  // OK (array)

// 任意のプロパティアクセス・呼び出しが通る
notSure.foo.bar.baz();                // コンパイル OK (実行時にエラーの可能性)
notSure();                            // コンパイル OK

any の問題点

問題詳細
型チェックの放棄誤ったプロパティアクセスがコンパイルを通り、実行時に TypeError
感染拡大any から代入した変数も実質 any 扱いに — 型情報が連鎖的に失われる
IDE 支援の喪失補完が効かない、リファクタリングで参照箇所が見つからない
意図の喪失「何の型なのか」をコードから読み取れない

any と unknown の違い

TypeScript 3.0 で導入された unknown は any の安全な代替。受け取りは自由ですが、使う前に型を絞り込まないとエラーになります。

let a: any = JSON.parse('{"foo":1}');
let u: unknown = JSON.parse('{"foo":1}');

// any -> 何でも通る (危険)
a.foo.bar.baz();           // コンパイル OK
const x: string = a;       // OK (代入できてしまう)

// unknown -> 使う前に絞り込みが必要
u.foo;                     // エラー: Object is of type 'unknown'
const y: string = u;       // エラー: Type 'unknown' is not assignable

// 型ガードで絞り込んでから使う
if (typeof u === 'object' && u !== null && 'foo' in u) {
    console.log((u as { foo: unknown }).foo);
}

any の感染 — 注意すべき挙動

let a: any = "hello";
let b = a.length;          // b の型は any (string ではなく)
let c = b + 100;           // c も any

// 型推論が any に染まり、以降ずっと型情報が失われる
function process(input: any) {
    const data = input.payload;  // data: any
    const items = data.items;    // items: any
    return items.map((i: any) => i.name);  // 結果も any
}

noImplicitAny — 暗黙の any を禁止

型注釈がなく型推論もできない変数 (関数引数など) は暗黙的に any になります。tsconfig.jsonnoImplicitAny: true を設定するとこれをエラーに格上げ。

// tsconfig.json
{
    "compilerOptions": {
        "strict": true,             // 推奨: strict モード全部入り
        "noImplicitAny": true,      // 個別に有効化も可
        "strictNullChecks": true,
        "noImplicitThis": true
    }
}
// noImplicitAny: true の状態

function greet(name) {     // エラー: Parameter 'name' implicitly has an 'any' type
    return "Hello, " + name;
}

function greet(name: string) {   // OK
    return "Hello, " + name;
}

any の代替手段

状況推奨
値の型が事前にわからない (JSON.parse の結果など)unknown + 型ガード
ジェネリクスで「任意の型」を表したい<T> ジェネリック型パラメータ
「何かのオブジェクト」Record<string, unknown>object
関数の戻り値が空void (any ではない)
「絶対に値が返らない」never

any を使ってよい (許容する) ケース

  • レガシー JavaScript からの移行段階: 一旦 any でコンパイルを通し、徐々に型を付ける
  • 型定義ファイルがないサードパーティ ライブラリ: 一時的に declare const lib: any; でしのぐ
  • 動的なメタプログラミング: Proxy などで型が完全に変わる場合
  • テストコードの実装詳細: モック作成で意図的に型を緩める場合

ただしどのケースでも「ここで any を使う」と明示的にコメントを残し、いずれ型を付ける TODO を立てるのが良い習慣。

段階的に any を排除する

// Step 1: 一旦 any
function process(data: any) {
    return data.value * 2;
}

// Step 2: unknown に変える
function process(data: unknown) {
    if (typeof data === 'object' && data !== null && 'value' in data
        && typeof (data as any).value === 'number') {
        return (data as { value: number }).value * 2;
    }
    throw new Error('invalid');
}

// Step 3: 型を明示
type Payload = { value: number };
function process(data: Payload) {
    return data.value * 2;
}

any[] と Array

const arr: any[] = [1, "two", true, { a: 1 }];

arr.push("anything");      // OK
arr[0].foo.bar();          // コンパイル OK (実行時にエラー)

// 安全側に倒すなら unknown[]
const safer: unknown[] = [1, "two", true];
// safer[0] + 1;            // エラー: 'unknown' を数値演算できない

FAQ

Q: any と Object の違い
A: Object はオブジェクト型を表すが、プロパティアクセスは制限される。any は何でも許可。混同しがちなので注意。

Q: ESLint で any を禁止できる?
A: @typescript-eslint/no-explicit-any ルールで検出可能。チーム開発では有効化推奨。

Q: any// @ts-ignore の違い
A: any は値の型を緩める。@ts-ignore は次の 1 行のエラーを無視。どちらも応急処置で、本来は型を整備するのが正解。

関連

  • unknown — 安全な「不明な型」
  • never — 到達不可能を表す型
  • void — 値を返さないことを表す型
  • ジェネリクス — 型パラメータで「任意の型」を扱う
  • tsconfig の strict オプション — 型安全の基本設定