Как мне организовать модули/пакеты машинописного текста, используя типизацию tsd?

У меня есть довольно большой TS-проект с множеством внутренних библиотек, которые связаны друг с другом как пакеты npm. Иногда в .ts мне нужно поместить ссылки на некоторые внешние или внешние определения, предоставленные TSD, например: /// <reference path="../../typings/tsd.d.ts" /> Каждый пакет включает в себя собственные файлы .d.ts, ссылающиеся на ...root.../typings/tsd.d.ts.

Итак, когда я устанавливаю пакет зависимостей внутри другого, может быть несколько определений для некоторых внешних вещей, таких как ...root.../typings/node/node.d.t. И это вызывает ошибки транспиляции Duplicate identifier.

Думаю, вы все знаете эту проблему. Но я провел около дня в гугле, читая и пробуя множество решений, которые не работали нормально. :(

Пожалуйста, покажи мне выход из этого положения. Расскажите мне, как вы это делаете.


person Ivan Pesochenko    schedule 10.12.2015    source источник


Ответы (1)


Хм... Странная идея пришла. Поместите во все проекты хук-скрипт postinstall, который изменяет typings/tsd.d.ts и заменяет пути дублирующих файлов определений на пути родительского проекта, примерно так: /// <reference path="../../../../typings/node/node.d.ts" />

Это грязно, но может работать нормально

var fs = require('fs');
var path = require('path');



function searchParentTypingPath(currentPath, moduleName, depth){
    if (!depth) depth = 1;
    if (depth>4) return null;
    try{
        var filePath = currentPath+'/typings/'+moduleName+'/'+moduleName+'.d.ts';
        fs.accessSync(filePath);
        return filePath;
    }
    catch(e){
        return searchParentTypingPath(currentPath+'/..', moduleName, depth+1);
    }
}


module.exports = function (tsdFilePath, verbose){
    var tsdContent = fs.readFileSync(tsdFilePath).toString();
    var resultContent = '';
    tsdContent.split('\n').forEach(function(line){
        var match = line.match(/^\/\/\/\s+<reference path="([\/a-zA-Z0-9_\-.]+)"\s*\/>/);
        if (!match) {
            resultContent+=line+'\n';
            return;
        }
        var modulePath = match[1];
        if (!modulePath.match(/^\w+/)) {// it's not provided by TSD
            resultContent+=line+'\n';
            return;
        }
        var moduleName =  path.basename(modulePath, '.d.ts');

        var parentPath = searchParentTypingPath(path.dirname(tsdFilePath)+'/../..', moduleName);
        resultContent+='/// <reference path="'+(parentPath||modulePath)+'" />\n';
    });
    if (verbose) {
        console.log(resultContent);
        return resultContent;
    }
    fs.writeFileSync(tsdFilePath, resultContent);
};

person Ivan Pesochenko    schedule 10.12.2015