Programming Field

any - TypeScriptキーワード一覧

スポンサーリンク

「any」キーワードは「あらゆるデータを受け付ける型」である「any 型」を表す型として用いられます。

概要

(特筆の無いものは TypeScript/spec.md 「3.1 The Any Type」での定義によります。)

キーワード情報

詳細

「any」は「any 型」の型名として用いられるキーワードです。「any 型」は「any」という単語が示す通り「何でもあり」な型であり、「any 型」に対してはすべての値を代入可能です。

let x: any;                // any 型変数
x = 65535;                 // 数値は any 型変数に代入可能
x = null;                  // null 値も any 型変数に代入可能
x = { data: null };        // オブジェクトも any 型変数に代入可能
x = 'any';                 // 文字列も any 型変数に代入可能
let y: string = x;         // any 型はどの型に対しても代入可能
                           // (※ 静的型チェックが行われないので、通常は型チェック処理なしにこのような記述は行わない)

また、値の代入だけでなく値の参照に関しても「何でもあり」、すなわち型チェックとしてエラーかどうかのチェックが行われません。

// パラメーター「o」「p」に対して型を付加していないので「any」の扱いになる
// (「noImplicitAny」オプションが有効である場合はエラー(TS7006)になる)
function someFn(o, p) {
    console.log(o.toString()); // 「toString」の有無は特にチェックが行われない
    p();                       // 「p」が呼び出し可能(関数)かどうかはチェックされない
}

「any 型」は null 値undefined 値を含めすべての値を受け付ける型となりますが、「any 型」に対して型ガード(type guard)を用いることは可能であり、それによって型チェックを上手く効かせることが可能になります。

try {
    executeSomeProcess();
} catch (e) { // catch 句の変数は型を付けられないので、自動的に「any 型」になる
    if (typeof e === 'string') {
        // typeof での型ガードにより、このブロックでは「e」が文字列扱いになる
    } else if (e instanceof Error) {
        // instanceof での型ガードにより、このブロックでは「e」が「Error」オブジェクト扱いになる
    }
}

any 型は「何でもあり」な型ですが、コンパイル時チェックや入力補完など、TypeScriptの強みである型付けによる効果を放棄してしまうことになるため、一からTypeScriptコードを実装する際は、特殊な事情が無い限りできるだけ「any」の利用を避けるのが望ましいと考えられます。一方で、JavaScriptからTypeScriptに移行する際は、既存のコードに対して十分な型付け(特にオブジェクト型の定義)ができていない可能性があるため、そのような箇所では応急的に型を「any」とすることができます(この場合は今後の修正で順次「any」を減らしていくことが望まれます)。

TypeScript 3.0では似たような型に「unknown 型」が導入されており、多くの場合に「不明な型である」ことを厳密に表すことに適しているため、必要に応じて使い分けることができます。

なお、型を付加する箇所で型が省略されたものは「any 型」扱いとなりますが、(「allowJs」コンパイルオプションを有効にして)ES Moduleなどの扱いでJavaScriptファイルを読み込んだ場合、そこに定義された関数の引数や変数等も、原則「any 型」として扱われます。

逆に、JSファイル内のデータもTypeScriptの解析により型推論が可能であれば、any 型ではなく限定された型になる場合があります。例えば、エクスポートされたJavaScriptの関数がすべてのreturn文で文字列リテラルを返している場合は、その関数の戻り値の型は「string 型」として扱われます。

※ 「allowJs」コンパイルオプションが有効になっていない場合、JavaScriptファイルのTypeScriptファイルからのインポートは、型定義ファイルがないとインポート内容にかかわらず「any 型」として扱われます。また、「noImplicitAny」オプションが有効である場合はエラー(TS7016)として扱われます。
※ 「allowJs」を有効にするとJSファイルもコンパイル(変換)対象になるため、特にそれが外部モジュールである場合はビルド処理に大きく影響が出る可能性があります。