wallride
@wallride
Виртуализирую вселенную.

Как правильно организовать модули с использованием typescript и дефиниций TSD (DefinetelyTyped)?

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

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

Полагаю, что для тех, кто мне может помочь, более подробное описание излишне. :) Проблема распространённая и понятная. Непонятно, как это грамотно разрулить. Я уже целый день потратил на гугление и пробы всяких решений. Они или не работают, или вредят, или я их не понял. Поэтому, пожалуйста, объясните мне как ребёнку, как модулям на ts должно быть организованными.
  • Вопрос задан
  • 421 просмотр
Решения вопроса 1
wallride
@wallride Автор вопроса
Виртуализирую вселенную.
Ну вот один вариант я придумал... стрёмный, но всё же.
в package.json в скриптах повесить хук на postinstall, который пробежится по tsd.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);
};
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы