I играли с машинописным текстом, пытаясь интегрировать его в наш существующий проект javascript/requirejs. Как установка, у меня есть Visual Studio 2013 с TypScript для vs v 0.9.1.1. TypScript настроен (в visual studio) для компиляции модулей в формате amd.
Это то, что я нашел работает для меня (там может быть лучше, конечно)
- Использование драм-зависимость сказать машинопись компилятор добавляет нужный модуль в список компонентов, которые должен быть загружен
- В конструкторе экспортируемого класса используйте функцию requirejs require для фактического извлечения импортированного модуля (на этом этапе это синхронно из-за предыдущего шага). Для этого необходимо указать reference require.d.ц
Как примечание стороны, но так как на мой взгляд, необходимо машинопись, и потому, что он дал мне немного головной боли, в этом примере я покажу два способа экспортировать классы, которые используют интерфейсы. Проблема с интерфейсами заключается в том, что они используются для проверки типов, но они не производят никакого реального вывода (сгенерированный .js-файл пуст), и это вызывает проблемы типа «экспорт частного класса» Я нашел 2 способа экспорта классов, которые реализуют интерфейс:
- Просто добавьте АМД-зависимость к интерфейсу (как в файле Logger.ts) и экспортировать типизированный переменную, держащим новый экземпляр класса Экспортируемого класса может быть потреблено напрямую (т.е. myClass.log ('hello'));
- Не добавляйте amd-зависимость к интерфейсу (как в файле Import.ts) И экспортируйте функцию (например, Instantiate()), которая возвращает переменную типа, содержащую новый экземпляр класса экспортироваться класс может быть потреблен с помощью этой функции
похоже, что первый вариант лучше (т.е. myClass.instantiate() журнал («привет»).): вам не нужно вызывать функцию Instantiate, плюс вы получите типизированный класс для работы. Недостатком является то, что файл javascript [empty] интерфейса перемещается в браузер (но он все равно кэшируется, и, возможно, вы даже используете минификацию, и в этом случае это вообще не имеет значения).
В следующих блоках кода есть 2 машинописных модуля, загруженных с требованием (amd): Logger и Import.
ILogger.ts файл
interface ILogger {
log(what: string): void;
}
Logger.ts файл
///<reference path="./ILogger.ts"/>
//this dependency required, otherwise compiler complaints of private type being exported
///<amd-dependency path="./ILogger"/>
class Logger implements ILogger {
formatOutput = function (text) {
return new Date() + '.' + new Date().getMilliseconds() + ': ' + text;
};
log = function (what) {
try {
window.console.log(this.formatOutput(what));
} catch (e) {
;
}
};
}
//this approach requires the amd-dependency above for the interafce
var exportLogger: ILogger = new Logger();
export = exportLogger;
Использование Logger.ts в другом файле TS (Import.ts)
///<reference path="../../../ext/definitions/require.d.ts"/>
///<amd-dependency path="Shared/Logger"/>
///<amd-dependency path="./IImport"/>
class _Import implements IImport{
ko: any;
loggerClass: ILogger;
constructor() {
this.ko = require('knockout');//require coming from require.d.ts (in external_references.ts)
this.loggerClass = require('Shared/Logger');
}
init(vm: any) {
this.loggerClass.log('UMF import instantiated...');
}
}
////Alternative Approach:
////this approach does not require adding ///<amd-dependency path="./IImport"/>
////this can be consumed as <imported_module_name>.instantiate().init();
//export function instantiate() {
// var r : any = new _Import();// :any required to get around the private type export error
// return r;
//}
//this module can be consumed as <imported_module_name>.init();
var exported: IImport = new _Import();
export = exported;
IImport.ts файл
interface IImport {
init(vm: any): void;
}
Употреблять модуль импорта прямо из Javascript использовать что-то вроде (жаль, что я не пробовал этот, но он должен работать)
define (['Import'], function (import)
{
//approach 1
import.init();
////approach 2
//import.instantiate().init();
});
Вы имеете в виду требование вместо определения? И __aFile__ не используется, а sFile установлен в char из 'a'? Я пробовал все это, и это не сработало. –
@DavidThielen извините, мой плохой, Обновлен сгенерированный js – basarat
PS: они могут помочь: http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1 http://www.youtube.com/watch?v = 4AGQpv0MKsA – basarat