any - TypeScriptキーワード一覧
スポンサーリンク
「any」キーワードは「あらゆるデータを受け付ける型」である「any 型」を表す型として用いられます。
概要
(特筆の無いものは TypeScript/spec.md 「3.1 The Any Type」での定義によります。)
- (型としての)キーワード「any」(または「any 型」)は『あらゆるJavaScriptの値を表す型』を示します。
- 「any 型」に対しては、コンパイル時の構文チェック(static check)にて最小限の型チェックのみを行います。
- 具体的には、「any 型」の値に対してはあらゆる名前でプロパティー(メンバー)の参照が可能であり、また「any 型」の値を関数およびコンストラクターとして呼び出すことができます。
- TypeScriptは、型推論ができなかった型に関しては「any 型」として扱います。これには、型指定が省略されて型が限定されるような値が代入されなかったもの(変数や引数など)を含みます。
- 「any 型」はすべての型のsupertype(上位型)となり、すべての型と相互に代入可能となります。
キーワード情報
- 「any」は識別子としては予約されていません。(ユーザー定義の識別子として利用できます。)
- 「any」は型名として予約されています。(ユーザー定義の型名として利用できません。)
詳細
「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 型」として扱われます。
- 型定義ファイル(.d.ts)がある場合や、TypeScript言語サービスが解釈可能なJSDocによるヒントがある場合は、その型が優先的に利用されます。
逆に、JSファイル内のデータもTypeScriptの解析により型推論が可能であれば、any 型ではなく限定された型になる場合があります。例えば、エクスポートされたJavaScriptの関数がすべてのreturn文で文字列リテラルを返している場合は、その関数の戻り値の型は「string 型」として扱われます。
※ 「allowJs」コンパイルオプションが有効になっていない場合、JavaScriptファイルのTypeScriptファイルからのインポートは、型定義ファイルがないとインポート内容にかかわらず「any 型」として扱われます。また、「noImplicitAny」オプションが有効である場合はエラー(TS7016)として扱われます。
※ 「allowJs」を有効にするとJSファイルもコンパイル(変換)対象になるため、特にそれが外部モジュールである場合はビルド処理に大きく影響が出る可能性があります。