我可以让 TypeScript 包含用于转译的 node_modules 吗?

Jez*_*Jez 9 javascript node.js transpiler typescript

好的,所以我在设置 Node.js TypeScript 项目时遇到了一个有趣的情况。我希望能够使用非相对require引用来引用我的本地模块。TypeScript 和 Node.js 查找模块的方式是node_modules在当前目录中查找目录,然后在每个父目录中查找,直到找到包含引用的目录。因此,假设我有一个要在以下目录结构中引用的模块:

/node_modules        <-- Main NPM modules dir
    /...
/package.json
/src
    /node_modules    <-- My local modules dir
        /modules
            /myModule.ts
    /scripts
        /init.ts
Run Code Online (Sandbox Code Playgroud)

...在init.ts我这样引用myModule

import myModule from "modules/myModule";
Run Code Online (Sandbox Code Playgroud)

据我了解,我希望 TypeScript 将我的node_modules目录dist与所有其他.ts文件目录一起转换到输出目录,以便该dist目录如下所示:

/node_modules        <-- Main NPM modules dir
    /...
/package.json
/dist
    /node_modules    <-- My local modules dir
        /modules
            /myModule.js
    /scripts
        /init.js
Run Code Online (Sandbox Code Playgroud)

然后,当 Node.js 查找模块时,它会在dist/node_modules/modules/myModule.js. 所以在这种情况下,我实际上确实希望 TypeScriptnode_modules在其输入文件中包含该目录。不过,我似乎缺少一些基本的东西,因为 TypeScript 实际上默认忽略了这个目录。

我的场景是否是包含node_modules目录的合法场景,如果是,我如何让 TypeScript 在我刚运行时将它包含在转译中tsc(因此它将使用我的tsconfig.json文件)?

更新: 我发现我可以node_modules通过将它显式地放在include指令中来使它包含我的目录,.tsconfig.json如下所示:

"include": [
    "./src/node_modules/**/*",
    "./src/**/*"
]
Run Code Online (Sandbox Code Playgroud)

问题仍然存在;我是否在这里遇到了根本性的错误,因为我必须覆盖默认情况下 TypeScript 排除的内容?我已经对此进行了测试,当我将其转换为 transpile 时node_modules,它确实正确地找到了我的本地模块。

sat*_*ime 2

包含在转译中是不正确的node_modules。因为node_modules包含 javascript 并且在 ts 库的情况下不需要第二次转译,所以它们应该在.d.ts.

如果您有自定义类型,或者您想将类型添加到一些没有它们的库中,则需要使用自己的声明@types/*包。

在你的文件中,tsconfig.json你可以定义类型根(从哪里加载声明)。

{
    "compilerOptions": {
        "typeRoots": ["./declarations", "./node_modules/@types"],
        "types": ["node"],
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以安装npm i --save-dev @types/node@^12例如获取nodejs v12的声明。

并定义您自己的声明,declarations例如express./declarations/express/index.d.ts

{
    "compilerOptions": {
        "typeRoots": ["./declarations", "./node_modules/@types"],
        "types": ["node"],
    }
}
Run Code Online (Sandbox Code Playgroud)