Розширений - для отримання детальної інформації на основі деяких коментарів
Помилка
Помилка 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. Для модулів, які використовуються лише як частина системи типів, не вимагається викликів. Цей вибір невикористаних посилань є хорошою оптимізацією продуктивності, а також дозволяє додатково завантажувати ці модулі.
Основна ідея шаблону полягає в тому, що оператор import id = requ ('...') надає нам доступ до типів, відкритих зовнішнім модулем. Завантажувач модулів викликається (через потребу) динамічно, як показано на блоках if нижче. Це використовує оптимізацію опорного кулірування, щоб модуль завантажувався лише за потреби. Щоб ця схема працювала, важливо, щоб символ, визначений за допомогою імпорту, використовувався лише в позиціях типу (тобто ніколи в позиції, яка випромінюється в JavaScript).