Расширенный - для предоставления дополнительных сведений на основе некоторых комментариев.
Ошибка
Ошибка TS2306: Файл test.ts не является модулем.
Исходя из факта, описанного здесь http://exploringjs.com/es6/ch_modules.html
17. Модули
В этой главе объясняется, как встроенные модули работают в ECMAScript 6.
17.1 Обзор
В ECMAScript 6 модули хранятся в файлах. На каждый файл приходится ровно один модуль и один файл на модуль. У вас есть два способа экспортировать вещи из модуля. Эти два способа можно смешивать, но обычно лучше использовать их по отдельности.
17.1.1 Экспорт с несколькими именами
Может быть несколько именованных экспортов:
//------ lib.js ------
export const sqrt = Math.sqrt;
export function square(x) {
return x * x;
}
export function diag(x, y) {
return sqrt(square(x) + square(y));
}
...
17.1.2 Единый экспорт по умолчанию
Может быть один экспорт по умолчанию. Например, функция:
//------ myFunc.js ------
export default function () { ··· } // no semicolon!
Исходя из вышеизложенного, нам нужен файл export
как часть файла test.js. Давайте настроим его содержимое следующим образом:
// test.js - exporting es6
export module App {
export class SomeClass {
getName(): string {
return 'name';
}
}
export class OtherClass {
getName(): string {
return 'name';
}
}
}
И теперь мы можем импортировать его тремя способами:
import * as app1 from "./test";
import app2 = require("./test");
import {App} from "./test";
И мы можем потреблять импортированные вещи вот так:
var a1: app1.App.SomeClass = new app1.App.SomeClass();
var a2: app1.App.OtherClass = new app1.App.OtherClass();
var b1: app2.App.SomeClass = new app2.App.SomeClass();
var b2: app2.App.OtherClass = new app2.App.OtherClass();
var c1: App.SomeClass = new App.SomeClass();
var c2: App.OtherClass = new App.OtherClass();
и вызовите метод, чтобы увидеть его в действии:
console.log(a1.getName())
console.log(a2.getName())
console.log(b1.getName())
console.log(b2.getName())
console.log(c1.getName())
console.log(c2.getName())
Исходная часть пытается помочь уменьшить сложность использования пространства имен
Оригинальная часть:
Я действительно настоятельно рекомендую проверить эти вопросы и ответы:
Приведу первое предложение:
Не используйте «пространства имен» во внешних модулях.
Не делай этого.
Шутки в сторону. Стоп.
...
В этом случае нам просто не нужно module
внутри test.ts
. Это может быть изменено его содержание test.ts
:
export class SomeClass
{
getName(): string
{
return 'name';
}
}
Подробнее здесь
В предыдущем примере, когда мы использовали каждый валидатор, каждый модуль экспортировал только одно значение. В таких случаях неудобно работать с этими символами через их квалифицированное имя, когда один идентификатор также подойдет.
export =
Синтаксис определяет один объект , который экспортируется из модуля . Это может быть класс, интерфейс, модуль, функция или перечисление. При импорте экспортированный символ потребляется напрямую и не уточняется никаким именем.
позже мы можем использовать это так:
import App = require('./test');
var sc: App.SomeClass = new App.SomeClass();
sc.getName();
Подробнее здесь:
В некоторых случаях вам может потребоваться загрузить модуль только при определенных условиях. В TypeScript мы можем использовать показанный ниже шаблон для реализации этого и других расширенных сценариев загрузки, чтобы напрямую вызывать загрузчики модулей без потери безопасности типов.
Компилятор определяет, используется ли каждый модуль в выпущенном JavaScript. Для модулей, которые используются только как часть системы типов, вызовы require не генерируются. Удаление неиспользуемых ссылок является хорошей оптимизацией производительности, а также позволяет дополнительно загружать эти модули.
Основная идея шаблона заключается в том, что оператор import id = require ('...') дает нам доступ к типам, предоставляемым внешним модулем. Загрузчик модуля вызывается (через require) динамически, как показано в блоках if ниже. Это усиливает оптимизацию отбраковки ссылок, так что модуль загружается только при необходимости. Чтобы этот шаблон работал, важно, чтобы символ, определенный с помощью импорта, использовался только в позициях типа (то есть никогда в позиции, которая будет передана в JavaScript).