2015-08-10 1 views
0

Добрый день. Я использую Node-Webkit с TypeScript, чтобы разработать доказательство концепции кросс-платформенного настольного приложения. Node-Webkit - это Webkit со встроенным узлом, который позволяет мне использовать Node apis через import require и использовать Webkit для UI (думаю, Apache Cordova \ Phonegapp), оба работают в одном процессе, поэтому вы можете просто import в вашем ViewControllers \ Services). IDE - это сообщество VS 2015 с узловыми инструментами 1.1TypeScript + Node-Webkit: нужен компилятор для игнорирования «ошибки» импорта Внешний модуль во внутреннем модуле

Моя проблема заключается в том, что у меня есть внутренний модуль с контроллером AngularJS, как и следовало ожидать в браузере, но он импортирует модули узла «fs» и «path» для сохранения данных в локальной файловой системе. Есть два варианта:

/// <reference path="../../typings/node/node.d.ts" /> 

// Works fine, but TS does not recognize it as module import, 
// thus, no Intellisense and type checking  
var path = require("path"); 

// TS recognizes module import and provides binding, 
// but gives an error "Import declarations in an 
// internal module cannot reference an external module" 
// and WILL NOT COMPILE to JS 
import path = require("path"); 

Быстрый обходной путь для меня был развиваться с import, а затем изменить var непосредственно перед сохранением.

Может кто-нибудь пожалуйста, скажите мне, как сделать одно из следующих действий:

  1. Подавите это частности предупреждение и сделать файл компиляции (в идеале, Подавите на уровне файлов)?
  2. Получить файл d.ts для этого конкретного сценария? Возможно, позже я попытаюсь преобразовать существующий node.d.ts, но, возможно, кто-то уже это сделал?
  3. Какое-то другое обходное решение?

ответ

1

Вы можете использовать модули CommonJS в своем проекте и объединить их с Browserify.

Другой вариант использования CommonJS является мнимое требуют функции:

var require = function (oldRequire: (moduleName: string) => any) { 
    return (moduleName: string) => 
     exports.sham.modules[moduleName].exports || oldRequire(moduleName); 
} (require); 

записи в начале каждого модуля:

exports.sham("yourModule"); 

и в модуле ссылающейся:

import yourModule = require("yourModule") 

См. gist.

0

Я бы полностью отказался от внутренней модульной системы, это было просто боль, когда я пытался заставить ее работать. Я сдавал их и был счастлив с тех пор. ;)

И если вы используете модули, вам лучше бежать вперед: использовать инструкцию импорта ES6 всюду и скомпилировать обратно на ES5 с помощью модулей commonjs/amd (соответственно для node/requirejs) до тех пор, пока у нас не будет встроенной поддержки импорта ES6.

0

Для тех, кто ищет это после выпуска TypeScript 2 (сентябрь 2016 года), просто установите @types/node, также см. this question для получения дополнительной информации.