2016-12-07 3 views
0

Я использую TypeScript на работе, где мы используем RequireJS в качестве нашего загрузчика AMD, и он работает достаточно хорошо. Я хотел бы преобразовать некоторые из моих личных JS-библиотек в TypeScript и задаюсь вопросом. Возможно ли использовать встроенную модульную систему TypeScript для экспорта .Иопределить с использованием require/amd, если конечный пользователь оказался используй это?Экспортировать глобальное и определять через систему модулей TypeScript?

Я хотел бы избежать нарушения совместимости с моими существующими пользователями/принуждения их к требованию.

Моего Существующий файл JS выложен как таковые, что она определяет глобальную И если определить определяется, определяет TickerGraph:

var TickerGraph = (function() { …class code… }); 

if(typeof define == "function") { 
    define([], function() { 
     return TickerGraph; 
    }); 
} 

В моей машинописи переписывании, я положил его с типом модуля, определенным а UMD следующим образом:

export = class TickerGraph { …class code… } 

Это выводит

(function (dependencies, factory) { 
    if (typeof module === 'object' && typeof module.exports === 'object') { 
     var v = factory(require, exports); if (v !== undefined) module.exports = v; 
    } 
    else if (typeof define === 'function' && define.amd) { 
     define(dependencies, factory); 
    } 
})(["require", "exports"], function (require, exports) { 
    "use strict"; 
    return (function() { 

который проверяет де мелкий/экспорт, но NOT определить глобальный ...

Я экспериментировал и устраняю экспорт, все вместе экспортируют глобальные, но, конечно, больше не определяют. Любая помощь здесь будет принята с благодарностью.

ответ

1

Единственный способ сделать это нет использование системы ввода-вывода.

Сам дескриптор самописца - хороший пример - lib/tsc.js может использоваться как узловой модуль, так и глобальный скрипт.

Там не-хорошо известный (для меня, по крайней мере) набор правил, которые они должны следовать, чтобы добиться того, что:

  • не имеют никаких export или import на верхнем уровне. Каждый export у них есть внутри namespace ts { }

  • один файл можно использовать символ из другого файла, при условии, что каждый файл имеет все его содержимое в namespace ts { }. Вы должны убедиться, что все взаимозависимые файлы скомпилированы вместе или имеют соответствующие директивы /// <reference. Предполагается, что вы используете опцию --outFile для создания одного выходного файла из нескольких файлов машинописных файлов.

В сущности, вы создаете один гигантский глобальный скрипт, состоящий из всех файлов, со всем внутренним пространством имен ts. Результат будет иметь var ts на верхнем уровне, который станет глобальным, если вы включите его как простой скрипт.

Для того, чтобы сделать его доступным в качестве узлового модуля, они имеют этот код в shims.ts:

// Here we expose the TypeScript services as an external module 
// so that it may be consumed easily like a node module. 
declare var module: any; 
if (typeof module !== "undefined" && module.exports) { 
    module.exports = ts; 
} 

Вы должны сделать что-то подобное для вашего модуля, используя define вместо module.Насколько мне известно, для этого нет встроенной поддержки.