2017-02-06 2 views
0

Скажем, у меня есть модульмашинопись: Как импортировать с оригинальными названиями

module A 
{ 
    export function X() 
    { 
     … 
    } 
} 

, который я хочу использовать в другом модуле, как это:

// Import fails with "Cannot find module 'A'." even with 
// A.ts being in same directory 
import * as A from "A"; 

module B 
{ 
    function Y() 
    { 
     // Module and function name carry information 
     // which I want to keep for readability. 
     A.X(); 
    } 
} 

Это должно быть простой случай экспорта и но я просто не могу заставить его работать.

UPDATE:

Как я уже говорил: Имя модуля несет значение. Имеются аналогичные именованные функции в нескольких модулях (или пространствах имен). то есть

module C 
{ 
    export function X() 
    { 
     … 
    } 
} 

И я, конечно, не хочу, чтобы сделать имя функции A.A_X и C.C_X - Резервные именование заставляет меня съежиться.

+0

Имя модуля - это имя файла. Ваш пример с использованием подстановочного импорта - это то, почему одно и то же имя функции в нескольких файлах не должно приводить к конфликту. Даже если у вас есть одно и то же имя файла с одинаковыми функциями в двух разных местах, вы можете импортировать оба с помощью подстановочных знаков с разными именами, ex '' 'import * как A from" ./A "; импорт * как OtherA из "../A"; '' 'Или вы можете импортировать сами функции с' as' like 'import {func как func1} из" ./A "; import {func как func2} из "./B" ' – Aaron

ответ

3

Используйте модуль

Не используйте ключевое слово module. Он был переименован в namespace, и не нужно создавать модули.

// A.ts 
export function X() 
{ 
    … 
} 

// B.ts 
import * as A from "./A"; 
function Y() 
{ 
    A.X(); 
} 

Модуль представляет собой JavaScript (или машинопись) файл с import или export на корневом уровне.

ТС пространства имен в модуле

Если вы хотите экспортировать namespace из вашего модуля, вот пример:

// A.ts 
export namespace A { 
    export function X() 
    { 
     … 
    } 
} 

// B.ts 
import {A} from "./A"; 
function Y() { 
    A.X(); 
} 

В файле A.ts, обратите внимание на два экспорта. На корневом уровне это стандартный модуль экспорта. В пространстве имен export function X является нестандартной функцией TypeScript, используемой для объявления публичного объявления в пространстве имен.

Кроме того, обратите внимание на изменение синтаксиса импорта в файле B.ts.

Вы можете прочитать презентацию синтаксиса модуля в this article из Mozilla.

+0

Если я не использую' namespace', как вы предлагаете, а затем на стороне javascript генерируется функция, называемая только функцией 'X(). Конечно, я хочу, чтобы сгенерированная функция javascript также называлась 'function A.X()'. (В противном случае у меня скоро появятся несколько конфликтующих функций init() и onXXXClick) В том случае, когда я использую 'namespace A'. Однако затем я получаю сообщение об ошибке «ошибка TS2306: Файл« .../A.ts »не является модулем». Это кажется настолько сложным. – Martin

+0

@Martin Сгенерированный JavaScript JavaScript не так важен. Через пару лет сгенерированная JS будет иметь ключевые слова «экспорт» и «импорт» и ваш импорт имени «A».Но я отредактирую, чтобы добавить пространства имен в ваш модуль. – Paleo

+0

@ Мартин Я отредактировал. – Paleo