Ошибка повторяющегося идентификатора с файлом d.ts и nodejs требуют с тем же именем

Теперь я уверен, что проблема в том, что есть включенный файл d.ts, который содержит модуль под названием «Shared» и оператор require, который включает переменную с тем же именем, если он используется в среде NodeJS.

// shared.d.ts
declare module Shared { ... }

// other_module.ts
/// <reference path="shared.d.ts"/>
if(require) { var Shared = require("shared"); }
export class Something {
    public someVar = new Shared.SomethingElse("blah");
}

Поэтому, когда я компилирую other_module.ts (который на самом деле представляет собой множество отдельных файлов), он говорит мне, что Shared — это повторяющийся идентификатор, что я могу понять, поскольку TS думает, что Shared — это модуль, но затем мне говорят, что это возврат запроса.

Проблема здесь в том, что выходные данные модулей должны быть совместимы с системой требований nodeJS, поэтому в этом случае, когда требуется other_module, он будет в своей собственной области и не будет знать о Shared.SomethingElse, поэтому требуется требование, поэтому внутренние модули в other_module сможет получить доступ к общей библиотеке, но в среде браузера он получит Shared.SomethingElse через глобальную область.

Если я удалю ссылку, файл не скомпилируется, так как он не знает о Shared, если я удалю требование, когда модуль загружается в nodejs (var otherModule = require("other_module")), он будет жаловаться, что не знает о Shared. Так есть ли способ решить эту проблему?


person Grofit    schedule 21.06.2014    source источник


Ответы (1)


Сначала ошибка

Повторяющийся идентификатор, потому что у вас есть Shared в shared.d.ts + в other_module.ts.

ИСПРАВЬТЕ A, будьте полностью внешними

Если вы хотите использовать amd / commonjs т.е. внешние модули, вам нужно использовать import/require (а не var/require, как вы делаете). Использование import создает новую переменную пространство объявления, и поэтому вы больше не загрязняете глобальное пространство имен Shared из other_module.ts. Короче говоря :

// shared.d.ts
declare module Shared { 
   export function SomethingElse(arg:string):any;
}
declare module 'shared'{ 
    export = Shared; 
}

И типизированный импорт:

// other_module.ts

/// <reference path="shared.d.ts"/>
import Shared = require("shared"); 

export class Something {
    public someVar = new Shared.SomethingElse("blah");
}

FIX B, как и раньше, но тогда вам нужно использовать другое имя

Внутри other_module не используйте имя Shared локально, если локальная область действия является глобальной областью действия. Я рекомендую вам просто везде использовать external и компилировать для узла с commonjs и браузера с amd, как показано в исправлении A, но если вам нужно, вот исправленный компилятор other_module.ts.

// other_module.ts
/// <reference path="shared.d.ts"/>
var fooShared: typeof Shared;
if(require) {  fooShared = require("shared"); }
else { fooShared = Shared; } 
export class Something {
    public someVar = new fooShared.SomethingElse("blah");
}
person basarat    schedule 21.06.2014
comment
проблема в том, что мне нужно загрязнить глобальное пространство имен для использования в браузере, сценарий в основном представляет собой контракт данных в веб-службе, который совместно используется сервером и клиентом. Поэтому я просто хочу 1 набор классов, который можно использовать с обеих сторон. Поэтому я попытался написать его таким образом, чтобы, если доступен require и т. д., он использовал это, в противном случае он просто полагался на глобальные переменные. Если бы я пошел вниз, используя маршрут импорта, мне нужно было бы использовать загрузчики модулей в браузере, что не так. Также, чтобы использовать import Shared, мне нужно использовать export module в общей библиотеке, но это МНОГИЕ файлы. - person Grofit; 21.06.2014
comment
Ах! ваш пример B кажется, что он будет работать, попробуем это и сообщим +1 за идеи в любом случае. - person Grofit; 21.06.2014
comment
Кажется, это работает, так что это должно хотя бы помочь мне преодолеть этот горб, спасибо за помощь. - person Grofit; 21.06.2014