TypeScriptには、変数宣言空間と型宣言空間という2つの宣言空間があります。これらの概念については以下で解説します。
型宣言空間には型アノテーションとして使用できるものが含まれています。例えば以下は型宣言です:
class Foo {};
interface Bar {};
type Bas = {};
これは、 Foo
、Bar
、 Bas
などを型名として使用できることを意味します。例:
var foo: Foo;
var bar: Bar;
var bas: Bas;
あなたが interface Bar
を持っていても、変数宣言空間に宣言されないので変数として使うことはできません。これを以下に示します。
interface Bar {};
var bar = Bar; // ERROR: "cannot find name 'Bar'"
cannot find name
と言うのは、変数宣言空間にBar
という名前が宣言されていないからです。それは次のトピック「変数宣言空間」につながります。
変数宣言空間(Variable Declaration Space)には、変数として使用できるものもあります。class Foo
は、型宣言空間にFoo
型を宣言することを見てきました。驚かないでください。それは、変数宣言空間に対しても同様に、変数Fooを宣言します:
class Foo {};
var someVar = Foo;
var someOtherVar = 123;
クラスを変数として渡したいことがあるので、これは素晴らしいことです。覚えておくこと:
- 型宣言空間にしか宣言されない
interface
のようなものを変数として使うことはできません
同じように、var
を使って宣言したものは変数宣言空間だけに宣言されるので、型アノテーションとして使うことはできません:
var foo = 123;
var bar: foo; // ERROR: "cannot find name 'foo'"
cannot find name
というエラーが発生する理由は、型宣言空間でfoo
という名前が定義されていないからです。