2016-02-25 3 views
2

Я пытаюсь понять, как правильно работать с модулями типа TSI и классическим JS.ТипScript не может найти модуль, если он содержит требуемый

Я создал очень простой проект, со следующей архитектурой файла:

. 
├── index.ts 
├── lodash.d.ts 
├── module.ts 
└── node_modules 
    └── lodash 

lodash был установлен с npm. Поскольку, как представляется, нет никакой информации о типизациях, я написал базовый файл d.ts, который описывает только одну функцию, только для того, чтобы угодить tsc и избежать ошибки об отсутствии значения lodash.

lodash.d.ts

declare module "lodash" { 
    export function reverse(array: any[]): any[]; 
} 

В моем module.ts файл, импортировать lodash с require и выставить функцию на модуле, который я использую на index.ts файл.

module.ts

/// <reference path="./lodash.d.ts" /> 

import _ = require('lodash'); 

module FooModule { 
    export function foo() { 
    return _.reverse([1, 2, 3]); 
    } 
} 

index.ts

/// <reference path="./module.ts" /> 

let a = FooModule.foo(); 
console.log(a); 

Проблема заключается в том, что tsc (и так VS Code) говорит мне, что он не может найти имя FooModule.

$ tsc index.ts --module commonjs -outDir build 
index.ts(3,9): error TS2304: Cannot find name 'FooModule'. 

Однако, если я удалить import _ = require('lodash'); из module.ts, он работает правильно (за исключением очевидного факта, что _ переменная теперь не определено).

Я делаю что-то не так с этим require?

ответ

1

Вы смешиваете внутренние модули и внешние модули. Если вы используете оператор импорта или экспорта верхнего уровня в файле .ts, сам файл автоматически рассматривается как внешний модуль, его содержимое является частью этого модуля (require - это оператор импорта).

Если вы поместили внутренний модуль внутри внешнего модуля (module или namespace), вы эффективно дублируете содержимое своего модуля. Это не хорошо.

Рассмотрим следующий пример:

module.ts

import _ = require('lodash'); 

module FooModule { 
    export function foo() { 
     return _.reverse([1, 2, 3]); 
    } 
} 

Функция foo теперь эффективно module.FooModule.foo при экспорте внутренний модуль FooModule от внешнего модуля module:

export module FooModule { 
    // ... 
} 

Однако это плохой.

+0

Получаю, спасибо за четкое объяснение.Но если экспортировать 'FooModule', как вы предложили в конце вашего ответа, это плохая практика, какой чистый способ сделать это? Или, если это более архитектурная проблема, как мне сделать, чтобы потреблять узловые модули по частям кода, который я хочу открыть в моем проекте? – Blackus

+0

@Blackus Просто удалите часть модуля FooModule и оставьте свои функции открытыми. Они будут частью модуля 'module' (или независимо от имени вашего файла без расширения' .ts'). Кроме того, не забывайте, что вам понадобится система загрузки модуля во время выполнения (у Node.js есть встроенный). –

+1

Я, наконец, понял это, он просто работает как модули CommonJS (в данном случае). Что на самом деле обмануло меня в первую очередь, это мой способ построения (я использую веб-пакет с моим реальным проектом), что было неправильно, и все мои файлы были неправильно перестроены. Теперь все ясно. Еще раз спасибо :) – Blackus

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