我想将我的应用程序拆分为不同的节点模块,并且有一个主模块,它也构建了所有其他模块,我想使用带有es6模块的typescript。
这是我计划的项目结构:
我希望能够在框架中定义可以在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
答案 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
的所有有趣部分,请使用framework
和package.json
创建一个main
文件条目分别指向生成的js和生成的声明,即
typings
将此模块提交给git repo,比如bitbucket:" https://myUser@bitbucket.org/myUser/framework.git"
{
"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_a
,framework
),然后将它们编译成{{ 1}}在使用它们之前。
答案 2 :(得分:1)