2016-01-29 2 views
3

С Java импорт очень прост и понятен.Typcript, Requirejs, оператор импорта и псевдонимы

импортирован со следующим утверждением:

import fr.domain.MyUtils; 

Затем вы можете использовать его как это:

MyUtils.myStaticMethod(); 

Вам нужно пространство имен MyUtils только если есть два в одном файле.

С машинописным процессором AMD и требует, чтобы это было сложнее.

Здесь импорт заявление:

import u = require('fr/domain/MyUtils'); 

И путь использовать его:

u.fr.domain.MyUtils.myStaticMethod(); 

Довольно многословно ...

Единственный способ, которым я нашел, так плата за проезд, чтобы использовать псевдоним было удвоено заявление об импорте:

import u = require('fr/domain/MyUtils'); 
import MyUtils = u.fr.domain.MyUtils; 

После этого, что вы можете написать это в модуле:

MyUtils.myStaticMethod(); 

Это чище, но плагин Eclipse, TS получить полностью утрачена с этим и автоматическое завершение становится нестабильным. В автозавершении Visual Studio все в порядке, но «F12 Перейти к определению» должно выполняться дважды, что раздражает.

Есть ли лучший способ сделать это? Или мы просто должны держать пространства имен короткими, как мы можем?

+0

Пожалуйста, покажите ваш 'фр/домен/файл MyUtils' –

ответ

2

Вы делаете это неправильно.

Ваш модуль 'fr/domain/MyUtils' должен экспортировать только то, что должно быть MyUtils. то есть он должен выглядеть следующим образом:

export function myStaticMethod() { /* ...code... */ } 

Не следует экспортировать некоторые глобальный объект пространства имен, и он не должен добавлять ничего некоторого глобальный объект пространства имен, который вы получите где-то в другом месте. Естественное размещение файлов модулей в каталогах - это способ создания «пространств имен» при работе с внешними модулями.

Если вы сделаете это правильно, то ваш потребитель выглядит следующим образом:

import MyUtils = require('fr/domain/MyUtils'); 
MyUtils.myStaticMethod(); 

или даже более правильно с помощью ES модуля синтаксис:

import { myStaticMethod } from 'fr/domain/MyUtils'; 
myStaticMethod(); 
+0

Вы правы, я понимаю сейчас. Здесь хорошо объяснено: http: //www.typescriptlang.org/Handbook # modules-pitfalls-of-modules Когда они описывают, что я делаю как «Needless Namespacing»: «Поскольку сам внешний файл модуля уже является логической группировкой, а его имя верхнего уровня определяется код, который импортирует его, нет необходимости использовать дополнительный модуль для экспортируемых объектов ». – Ced

+0

На данный момент предпочтительным способом импорта (внешнего) модуля является синтаксис модуля ES6. Я думаю, что часть вашего ответа требует большего внимания - в настоящее время это немного больше, чем сноска. –

Смежные вопросы