Как исключить `node_modules / @ types / ** / node_modules`?

Я столкнулся с ситуацией, когда определение типа в node_modules/@types устанавливает свои собственные зависимости @types, и эти «вложенные» @types конфликтуют с моими @types верхнего уровня.

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

Как я могу исключить node_modules/@types/**/node_modules из моего tsconfig?

Одно предостережение - я использую awesome-typescript-loader, который может иметь некоторые ограничения..

Что я пробовал:

1 - глобус файла в свойстве exclude для исключения вложенных node_modules

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

2 - явное объявление types

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

3 - глобус файла в typeRoots для исключения вложенных модулей node_modules

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

Что я узнал

1 - exclude, похоже, не работает с @types

2 - включение типа с "типами" означает включение зависимых от него @types

3 - typeRoots, похоже, не работает с файловыми глобусами (или я неправильно пишу глобус)

По теме:

Исключить типизацию @types в установленных зависимостях

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 - Как игнорировать @ types / независимо от / node_modules для определенного каталога?

Подробная информация о моей среде

"node": "8.6.0", "typescript:" 2.8.3 "," awesome-typescript-loader ":" 5.0.0 "," webpack ":" 4.8.3 ",


person user2954463    schedule 25.05.2018    source источник
comment
Вы пробовали просто обновить свою версию до 1.6?   -  person Tim B James    schedule 25.05.2018
comment
@TimBJames ???? Не пробовал обновляться, хотя хотелось бы! Это для растягивающегося приложения AngularJS, которое все еще использует ngController в некоторых частях. Я надеюсь на решение, которое я смогу реализовать сейчас, без согласования с товарищами по команде и проведения обширного регрессионного тестирования.   -  person user2954463    schedule 25.05.2018
comment
Я взломал решение в package.json, но мне все равно хотелось бы знать, как можно избежать конфликтующих зависимостей. `postinstall: node rimraf.js node_modules / @ types / angular-ui-bootstrap / node_modules`   -  person user2954463    schedule 25.05.2018
comment
Я думаю, что проблему будет нелегко решить из-за разных версий зависимостей. Похоже, angular-ui-bootstrap всегда будет нужна более поздняя версия типов.   -  person Tim B James    schedule 25.05.2018


Ответы (3)


Решение, которое я нашел для этого, заключалось в том, чтобы указать каталог node_modules/@types в настройке tsconfig.json paths.

Вот фрагмент, который я изменил в моем tsconfig.json, и вы сможете адаптировать его для своего варианта использования. Мне нужно было изменить мои baseUrl и мои paths настройки.

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

В моем случае я использую абсолютные URL-адреса в своем проекте 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"]
}

person cdignam    schedule 08.02.2019

Используйте 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, объявите @types/angular как peerDependency в вашем файле package.json.

person user2954463    schedule 01.08.2018

Используйте следующий postinstall скрипт в своем package.json:

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

Это будет проходить через @types и удалять нежелательные зависимости переходного типа.

person Nikola Mihajlović    schedule 26.05.2021