Declaration Spaces

TypeScriptには、変数宣言空間と宣言空間という2つの宣言空間があります。これらの概念については以下で解説します。

型宣言空間(Type Declaration Space)

型宣言空間には型アノテーションとして使用できるものが含まれています。例えば以下は型宣言です:

class Foo {};
interface Bar {};
type Bas = {};

これは、 FooBarBasなどを型名として使用できることを意味します。例:

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)

変数宣言空間(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という名前が定義されていないからです。