从外部节点模块导入打字稿

dav*_*vid 4 node.js typescript

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

这是我计划的项目结构:

  • 主要的
    • 节点模块
      • 德普-A
      • dep-b
  • 框架
    • 接口
      • IComponent.ts
  • 德普-A
    • 成分
      • 测试.ts
    • 节点模块
      • 框架
    • 索引.ts
  • dep-b
    • 节点模块
      • 框架

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

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

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

error TS2307: Cannot find module 'framework/interfaces/IComponent'
Run Code Online (Sandbox Code Playgroud)

Module not found: Error: Cannot resolve 'file' or 'directory' ./components/test
Run Code Online (Sandbox Code Playgroud)

Bru*_*der 5

TL;DRdeclaration: true使用in生成模块声明,并在文件条目tsconfig.json中为生成的类型指定文件typingspackage.json

框架

使用tsconfig与此类似的文件:

{
       "compilerOptions": {
        "target": "es5",
        "module": "commonjs",
        "declaration": true,
        "noImplicitAny": true,
        "removeComments": true,
        "outDir": "dist",
        ...
    },
    "files": [
         ...
    ]
}
Run Code Online (Sandbox Code Playgroud)

重要的一点是declaration: true它将在 dist 目录中生成内部声明

假设有一个index.ts文件(重新)导出 的所有有趣部分framework,创建一个package.json文件,其中 amaintypings条目分别指向生成的 js 和生成的声明,即

{
   "name": "framework",
   "main": "dist/index.js",
   "typings": "dist/index.d.ts",
   ...
 }
Run Code Online (Sandbox Code Playgroud)

将此模块提交到 git 存储库,例如 bitbucket:“ https://myUser@bitbucket.org/myUser/framework.git

德普-A

创建package.json依赖关系framework

{
    "dependencies": {
        "framework":     "https://myUser@bitbucket.org/myUser/framework.git"
    },
}
Run Code Online (Sandbox Code Playgroud)

这就对了。

import * from 'framework'
Run Code Online (Sandbox Code Playgroud)

将自动提取与类型的依赖关系

显然,可以使用dep-a完成框架所做的事情,即生成声明、更新 package.json 并使用dep-a作为在main中嵌入类型的模块

注意:如果您不想通过外部 git 存储库访问,则可以在 package.json/dependencies 中添加文件 URL