2013-11-20 4 views
0

Я пишу программу в TypeScript, которая в основном следует шаблону загрузки AMD, в котором классы загружаются с помощью оператора импорта.Как структурировать расширения в программе AMD TypeScript

import TestRunner = require('../TS/TestRunner'); 

Я, однако, хочу, чтобы включить некоторые методы расширения, которые расширяют объекты, такие как NodeList - так что будет небольшое количество файлов расширения, которые содержат расширение к lib.d.ts интерфейсов, а затем реализация дополнительного особенность - например ...

interface NodeList { 
    extensionMethod(...info): NodeList; 
} 

NodeList.prototype.extensionMethod = function (...info: string[]) { 
    return this; 
}; 

Я мог просто включить все расширения на старте моей программы, так что они доступны, - но я бы на самом деле хотел бы загрузить их по требованию, как и остальной части код. Проблема в том, что файл, содержащий расширения, на самом деле не экспортирует ничего для использования - он просто добавляет этот код к существующим объектам.

Каков наилучший способ включения расширений в мою программу TypeScript?

ответ

1

Вот настройка, которая работает. Ключевые моменты:

  • Вам нужно разместить interface расширения в файле, который не внешний модуль (в противном случае вы будете объявлять новый интерфейс во внешнем объеме модуля, а не расширение существующего типа).
  • Это работает только с объектами, определенными в глобальном масштабе. Продвижение прототипов других объектов уже достаточно опасно, поэтому никаких больших потерь в этой учетной записи нет.
  • Вам необходимо вручную вызвать require. Для сценариев AMD используйте недокументированный тег /// <amd-depdendency path="path" />.
  • Файл, содержащий расширения, может быть при необходимости внешним модулем.

myExtensions.d.ts

// In case you're not using node.d.ts 
declare var process: process; 

interface process { 
    getFour: any; 
} 

extensions.ts

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

process.getFour =() => 4; 

consumer.ts

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

// In case you're not using node.d.ts 
declare var require; 

// Manual import of extensions 
require('./extensions'); 

console.log(process.getFour()); // Works 
+0

Блестящий - спасибо. Я буду обновлять, чтобы использовать этот способ. – Fenton

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