我应该如何使用tsd typings组织打字稿模块/包?

时间:2015-12-10 11:04:42

标签: node.js typescript definitelytyped

我有一个相当大的TS项目,其中包含许多内部库,它们作为npm packades相互链接。 有时在.ts中我需要提供TSD提供的一些环境或外部定义的引用,如下所示: /// <reference path="../../typings/tsd.d.ts" /> 每个包都包含引用...root.../typings/tsd.d.ts的自己的.d.ts文件。

因此,当我在另一个内部安装依赖包时,某些环境内容可以有多个定义,例如...root.../typings/node/node.d.t。它会导致转换错误Duplicate identifier

我想你们都知道这个问题。但我花了大约一天谷歌搜索和阅读并尝试了一些不能正常工作的解决方案。 :(

请告诉我一个解决方法。告诉我你是怎么做到的。

1 个答案:

答案 0 :(得分:0)

嗯......一个奇怪的想法来了。 在所有项目中放入一个postinstall钩子脚本,用于更改typings/tsd.d.ts并将重复定义文件的路径替换为父项目,例如:/// <reference path="../../../../typings/node/node.d.ts" />

它很脏但可以正常工作

&#13;
&#13;
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);
};
&#13;
&#13;
&#13;