在 Typescript 中导入“rootDir”之外的文件

Edd*_*oli 10 typescript tsconfig

我有一个具有以下文件结构的项目

\n
project\n|\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 App1/static/App1\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ts\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 js\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n|\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 App2/static/App2\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ts\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 js\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n|\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 App3/static/App3\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 ts\n|   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 js\n|   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n|\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tsconfig.json\n
Run Code Online (Sandbox Code Playgroud)\n

每个应用程序都需要在目录中找到已编译的 Typescript 文件ts才能进入js同一目录中的每个文件夹。为了使这项工作到目前为止,我tsconfig.json在“项目”目录的顶部找到了一个全局文件。然后,tsconfig.json在每个应用程序内部找到的文件具有以下配置:

\n
{\n    "extends": "../../../tsconfig.json",    // Path to global tsconfig.json\n    "compilerOptions": {\n        "outDir": "js",                     // Where the transpiled Javascript files go\n        "rootDir": "ts",                    // Where the Typescript files are\n    },\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后,tsc -p App1/static/App1例如,当我运行时,App1\ 文件夹内的 Typescript 文件ts将被编译并放置在该文件夹内js。到目前为止一切都还好。

\n

现在,我的问题是有时 App1 需要来自 App3 的文件,因此我执行类似于此的导入:

\n
// App1/static/App1/test.ts\nimport { module } from "../../../../App3/static/App3/ts/module.js"\n
Run Code Online (Sandbox Code Playgroud)\n

这有效,但是,我在导入时收到以下警告:error TS6059: File \'module.js\' is not under \'rootDir\' \'/ts/\'. \'rootDir\' is expected to contain all source files.

\n

我可以对tsconfig.jsonApp1 中的文件进行哪些更改才能使其正常工作。我尝试在我的配置中将../../../App3/static/App3/ts文件夹添加为 a (通过使用),但这似乎不起作用。rootDirrootDirs

\n

Rob*_*ord 6

引用package.json文件中的每个子项目

// App1 package.json:
{
    "dependencies": {
        "app2": "../App2/static/App2",
        "app3": "../App3/static/App3",
    }
}
Run Code Online (Sandbox Code Playgroud)

现在您可以将其他应用程序作为外部包引用

import { module } from "app3/js/module.js"

导入已编译的 JavaScript,而不是源打字稿。

我不能 100% 确定您是否需要摆弄导入/导出设置,但这应该可以帮助您完成 90% 的工作。

您可能还需要在每个子项目的 tsconfig 中设置 "declaration": true,以便在构建文件夹中创建 .d.ts 文件。