2016-05-02 4 views
0

Я использую библиотеку Q в сценарии, который я хотел бы запустить в веб-рабочем и в узле. Если я ссылаться q.d.ts так:Использование .d.ts. файлы для JS, предназначенные для узла и веб-рабочего

/// <reference path="../typings/q/Q.d.ts" /> 

if(importScripts != undefined && WorkerGlobalScope == undefined 
     && typeof module !== 'undefined' && module.exports){ 

    // We're in a Node (child) process 
    var Q = require("q") 
}else{ 
    // We're in a web-worker 
    importScripts('q'); 
} 

Я получаю следующее сообщение об ошибке, которое хорошо объясняется в этом answer:

error TS2300: Duplicate identifier 'Q'. 

, но если я заменяю var Q = require("q") с import Q = require("q"), я получаю эту ошибку, потому что импорт вложен в предложение if, а не на верхнем уровне сценария:

Есть ли способ потребовать Q так, чтобы он работал с обоими require() и веб-работником importScripts()?

ответ

1

Is there a way to require Q in so that it works with both node's require() and web-worker's importScripts()?

Вам нужно импортировать просто Типу из Q, а затем загрузите q лениво при необходимости. Итак:

import _Q = require('q'); 
if(importScripts != undefined && WorkerGlobalScope == undefined 
     && typeof module !== 'undefined' && module.exports){ 

    // we're in a Node (child) process 
    var Q:typeof _Q = require("q") 
}else{ 

    importScripts('q'); 
} 

Больше

Это описано в ленивой секции загрузки здесь: https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html

+0

Это прекрасно работает, когда '.d.ts' файл объявляет модуль, но и для тех, что дон» t, например ['require.d.ts'] (https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/q/Qdts),' import _r = require ('requirejs') 'приводит к этому ошибка: 'Не могу найти модуль 'requirejs'.' – Jthorpe

+0

У меня есть [другой связанный вопрос] (http://stackoverflow.com/questions/38016793), что было бы здорово, если бы вы могли взглянуть на него. Благодаря! – Jthorpe