如何排除`node_modules/@types/**/node_modules`?

Posted

技术标签:

【中文标题】如何排除`node_modules/@types/**/node_modules`?【英文标题】:How to exclude `node_modules/@types/**/node_modules`? 【发布时间】:2018-11-04 22:27:33 【问题描述】:

我遇到了这样一种情况,node_modules/@types 中的类型定义正在安装自己的 @types 依赖项,而这些“嵌套”@types 与我的*** @types 冲突。

@types
|-angular //v1.5
|-angular-ui-bootstrap
  |-node_modules
    |-@types
       |-angular //v1.6

如何在我的 tsconfig 中排除 node_modules/@types/**/node_modules

一个警告 - 我正在使用 awesome-typescript-loader,may have some limitations。

我的尝试:

1 - exclude 属性中的文件 glob 以排除嵌套的 node_modules

    compilerOptions.exclude: '../node_modules/@types/**/node_modules'

2 - 明确声明 types

    compilerOptions.types: ['angular', 'angular-ui-bootstrap']

3 - typeRoots 中的文件 glob 以排除嵌套的 node_modules

    compilerOptions.typeRoots: ['../node_modules/@types/**/!(node_modules)']

我学到了什么

1 - exclude 似乎不适用于@types

2 - 包含带有“类型”的类型意味着包含其依赖的@types

3 - typeRoots 似乎不适用于文件 glob(或者我写错了 glob)

相关:

Exclude @types typings in installed dependencies

https://github.com/Microsoft/TypeScript/issues/9731

https://github.com/Microsoft/TypeScript/issues/11917

https://github.com/s-panferov/awesome-typescript-loader/issues/492

tsconfig - How to ignore @types/whatever/node_modules for a specific directory?

我的环境详情

“节点”:“8.6.0”, “打字稿:“2.8.3”, “真棒打字稿加载器”:“5.0.0”, "webpack": "4.8.3",

【问题讨论】:

您是否尝试过将您的版本更新到 1.6? @TimBJames ????还没有尝试升级,虽然我希望我能!这是一个庞大的 AngularJS 应用程序,它在某些部分仍然使用ngController。我希望有一个我现在可以实施的解决方案,无需与队友协调并进行广泛的回归测试。 我在 package.json 中破解了一个解决方案,但我仍然想知道如何避免冲突的依赖关系。 ` "postinstall": "node rimraf.js node_modules/@types/angular-ui-bootstrap/node_modules"` 我认为由于依赖版本不同,这个问题不容易解决。看起来angular-ui-bootstrap 总是想要更高版本的类型。 【参考方案1】:

在您的 package.json 中使用以下 postinstall 脚本:

for d in node_modules/@types/*/ ; do
  rm -rf $dnode_modules
done

这将遍历@types 并删除不需要的传递类型依赖项。

【讨论】:

【参考方案2】:

我为此找到的解决方案是在 tsconfig.json paths 设置中指定 node_modules/@types 目录。

这是我在tsconfig.json 中更改的 sn-p,您应该可以根据自己的用例进行调整。我需要修改我的baseUrlpaths 设置。

   ...
    "baseUrl": ".",
    "paths": 
      "@/*": ["./src/*"],
      "*": ["./node_modules/@types/*"]
    
   ...

在我的例子中,我在我的 TS 项目中使用绝对 url,所以我的本地文件都是相对于 @/ 的。我认为如果您不使用这样的绝对网址,您的配置应该具有以下内容:

   ...
    "baseUrl": ".",
    "paths": 
      "*": ["./src/*", "./node_modules/@types/*"]
    
   ...

这是我完整的tsconfig.json,里面可能有很多不相关的信息,供参考。


  "compilerOptions": 
    "outDir": "./build/",
    "sourceMap": true,
    "allowJs": true,
    "checkJs": true,
    "jsx": "react",
    "target": "es2017",
    "module": "commonjs",
    "moduleResolution": "node",
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "removeComments": false,
    "preserveConstEnums": true,
    "skipLibCheck": true,
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "baseUrl": ".",
    "paths": 
      "@/*": ["./src/*"],
      "*": ["./node_modules/@types/*"]
    
  ,
  "include": ["**/*", "*"],
  "exclude": ["build", "node_modules", "coverage"]


【讨论】:

【参考方案3】:

使用peerDependencies 确保您只有一个版本的依赖项。

即如果我使用 angular 和 angular-mocks 的类型,则 angular-mocks 将有自己的 @types/angular

@types/angular  // => 1.5.8
@types/angular-mocks // => 1.5.8
@types/angular-mocks/node_modules/@types/angular // => *

要防止安装两个版本的@types/angular,请在您的 package.json 文件中将 @types/angular 声明为 peerDependency。

【讨论】:

以上是关于如何排除`node_modules/@types/**/node_modules`?的主要内容,如果未能解决你的问题,请参考以下文章

不允许操作 mkdir \path\\node_modules\\@types\''

node_modules/@types/node/index.d.ts(20,1):错误 TS1084:无效的“参考”指令语法

node_modules/@types/react-dom/.... 的错误。后续的变量声明必须具有相同的类型。变量“a”

使用 forge-viewer/node_modules/@types/three 中的 THREE 会导致编译器错误

错误 TS1259:模块 '"./node_modules/@types/express/index"' 只能使用 'esModuleInterop' 标志默认导入

node_modules/@types/ 错误(接口“元素”不能同时扩展类型“ReactElement<any>)