Как в названии: поддерживает ли TypeScript пространство имен? Если да, то как их использовать?
Поддерживает ли пространство имен TypeScript?
Ответ 1
Typescript позволяет определить модули, тесно связанные с тем, что будет в ECMAScript 6. Следующий пример берется из спецификации:
module outer {
var local = 1;
export var a = local;
export module inner {
export var x = 10;
}
}
Как вы можете видеть, модули имеют имена и могут быть вложенными. Если вы используете точки в именах модулей, typescript скомпилирует это для вложенных модулей следующим образом:
module A.B.C {
export var x = 1;
}
Это равно
module A {
module B {
module C {
export var x = 1;
}
}
}
Важно также, что если вы повторно используете одно и то же имя модуля в одной программе typescript, код будет принадлежать одному модулю. Следовательно, вы можете использовать вложенные модули для реализации иерархических пространств имен.
Ответ 2
Начиная с версии 1.5, Typescript поддерживает ключевое слово namespace
. Пространства имен эквивалентны внутренним модулям.
До:
module Math { export function add(x, y) { ... } }
После:
namespace Math { export function add(x, y) { ... } }
Для определения внутреннего модуля теперь вы можете использовать как module
, так и namespace
.
Ответ 3
Вот пример пространства TypeScript:
///<reference path='AnotherNamespace/ClassOne.ts'/>
///<reference path='AnotherNamespace/ClassTwo.ts'/>
module MyNamespace
{
import ClassOne = AnotherNamespace.ClassOne;
import ClassTwo = AnotherNamespace.ClassTwo;
export class Main
{
private _classOne:ClassOne;
private _classTwo:ClassTwo;
constructor()
{
this._classOne = new ClassOne();
this._classTwo = new ClassTwo();
}
}
}
Вы можете узнать больше здесь: http://www.codebelt.com/typescript/javascript-namespacing-with-typescript-internal-modules/
Ответ 4
Не существует ключевого слова "namespace", но внутренние модули (с использованием ключевого слова "module" ) и внешние модули (с использованием ключевого слова "export" ) предлагают аналогичный способ разделить ваш код на логические иерархии.
Ответ 5
False...
module A.B.C {
export var x = 1;
}
равно
module A {
export module B {
export module C {
export var x = 1;
}
}
}
потому что вы можете писать вне модуля A:
var y = A.B.C.x;
Но:
module A {
module B {
module C {
export var x = 1;
}
var y = C.x; // OK
}
//var y = B.C.x; // Invalid
}
//var y = A.B.C.x; // Invalid