从外部节点模块导入typescript

时间:2015-12-02 09:35:36

标签: node.js typescript

我想将我的应用程序拆分为不同的节点模块,并且有一个主模块,它也构建了所有其他模块,我想使用带有es6模块的typescript。

这是我计划的项目结构:

    • node_modules
      • DEP-A
      • DEP-B
  • 框架
    • 接口
      • IComponent.ts
  • DEP-一个
    • 部件
      • test.ts
    • node_modules
      • 框架
    • index.ts
  • DEP-B
    • node_modules
      • 框架

我希望能够在框架中定义可以在dep-a,dep-b和main中使用的接口。

如何正确设置?我可以从主模块编译所有内容吗?我是否需要为framework,dep-a,...和另一个打字文件创建不同的包?对此最好的方法是什么?

我已经设置了一些测试文件和文件夹,并使用npm链接链接依赖项和webpack来捆绑文件,我总是遇到文件未找到的问题:

error TS2307: Cannot find module 'framework/interfaces/IComponent'

Module not found: Error: Cannot resolve 'file' or 'directory' ./components/test

3 个答案:

答案 0 :(得分:3)

TL; DR 使用declaration: true中的tsconfig.json为模块生成声明,并在typings的{​​{1}}条目中指定生成的输入文件1}}文件

框架

使用与此类似的package.json文件:

tsconfig

重要的位是{ "compilerOptions": { "target": "es5", "module": "commonjs", "declaration": true, "noImplicitAny": true, "removeComments": true, "outDir": "dist", ... }, "files": [ ... ] } ,它将在dist目录中生成内部声明

假设有一个declaration: true文件(重新)导出index.ts的所有有趣部分,请使用frameworkpackage.json创建一个main文件条目分别指向生成的js和生成的声明,即

typings

将此模块提交给git repo,比如bitbucket:" https://myUser@bitbucket.org/myUser/framework.git"

DEP-A

{ "name": "framework", "main": "dist/index.js", "typings": "dist/index.d.ts", ... } 中的

创建了对package.json

的依赖关系
framework

就是这样。

{
    "dependencies": {
        "framework":     "https://myUser@bitbucket.org/myUser/framework.git"
    },
}

将自动拉> 依赖

显然,可以使用 dep-a 使用 framework 完成的操作,即生成声明,更新package.json并使用 dep-a 作为 main

中具有嵌入式输入的模块

注意:如果您不想通过外部git repo,可以在package.json / dependencies中执行文件URL

答案 1 :(得分:1)

TypeScript 1.6中的内容是typings模块中的package.json属性。你可以check the relevant issue on GitHub

因此,假设您要创建单独的模块(dep-a,框架)。您可以执行以下操作:

main.ts                 // (1)
package.json            // (2)
node_modules/
  dep_a/                
    index.js            // (3)
    index.d.ts          // (4)
    package.json        // (5)
    node_modules/
      framework/ 
        index.js        // (6)
        index.d.ts      // (7)
        package.json    // (8)

让我们看看你的文件中有什么:

//(1) main.ts
import * as depA from "depA";

console.log(depA({ a : true, b : 2 }) === true) // true;
//(2) package.json
{
  name: "main",
  dependencies: {
    "dep_a" : "0.0.1"
  }
  ...
}

depA

//(3) dep_a/index.js
module.exports = function a(options) { return true; };
//(4) dep_a/index.d.ts;

import * as framework from "framework";

export interface IDepA extends framework.IFramework {
   a : boolean
}

export default function a(options: IDepA) : boolean; 
//(5) dep_a/package.json
{
  name: "dep_a",
  dependencies: {
    "framework" : "0.0.1"
  },
  ...
  typings : "index.d.ts" // < Magic happens here
}

framework

//(6) dep_a/node_modules/framework/index.js
module.exports = true // we need index.js here, but we will only use definition file
//(7) dep_a/node_modules/framework/index.d.ts;

export interface IFramework {
   b : number;
}
//(8) dep_a/node_modules/framework/package.json
{
  name: "framework"
  ...
  typings : "index.d.ts"
}

我在这个答案中没有包含(为了清楚起见)是另一个编译阶段,所以你实际上可以用typescript编写模块(dep_aframework),然后将它们编译成{{ 1}}在使用它们之前。

答案 2 :(得分:1)