TypeScript: Дублікат ідентифікатора 'IteratorResult'


117

Я намагаюсь скомпілювати через - який tscя встановив глобально - і я отримую повідомлення про помилку:

~/AppData/Roaming/nvm/v11.15.0/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6 - error TS2300: Duplicate identifier 'IteratorResult'.

41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
        ~~~~~~~~~~~~~~

  node_modules/@types/node/index.d.ts:170:11
    170 interface IteratorResult<T> { }
                  ~~~~~~~~~~~~~~
    'IteratorResult' was also declared here.

node_modules/@types/node/index.d.ts:170:11 - error TS2300: Duplicate identifier 'IteratorResult'.

170 interface IteratorResult<T> { }
              ~~~~~~~~~~~~~~

~/AppData/Roaming/nvm/v11.15.0/node_modules/typescript/lib/lib.es2015.iterable.d.ts:41:6
    41 type IteratorResult<T, TReturn = any> = IteratorYieldResult<T> | IteratorReturnResult<TReturn>;
            ~~~~~~~~~~~~~~
    'IteratorResult' was also declared here.


Found 2 errors.

У мене встановлена @types/nodeверсія 10.1.0. ( @latestмає свої проблеми ...)

tsconfig.json

{
  "compilerOptions": {
    "target": "es2018",
    "moduleResolution": "node",
    "module": "commonjs",
    "jsx": "react",
    "lib": [
      "dom",
      "es2018",
      "dom.iterable",
      "scripthost"
    ],
    "typeRoots": [
      "./node_modules/@types",
      "./types"
    ],
    "types": [],

    "alwaysStrict": true,
    "strictNullChecks": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noUnusedLocals": true,

    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "esModuleInterop": true,

    "sourceMap": true,

    "outDir": "dist"
  },
  "files": [
    "app/index.tsx"
  ],
  "include": [
    "app/**/*.ts",
    "app/**/*.tsx",
    "test/**/*.ts",
    "test/**/*.tsx",
    "node_modules/@types/**/*.d.ts",
    "./types/**/*.d.ts"
  ],
  "exclude": [
    "dist"
  ]
}

Якщо я видаляю typescriptглобально і запускаю npx tscце працює, але в установці та запуску typescriptглобально не повинно бути нічого поганого . Зрештою, у цьому вся суть глобальної інсталяції.

Тим часом у мене є обхідне рішення, яке стосується просто псевдоніма tsc (я використовую git bash у Windows).

alias tsc="path/to/project/node_modules/.bin/tsc.cmd"

ця проблема почала з’являтися для мене, коли я оновив глобально з v3.5.3 до v3.6.2 ... так що, здогадуючись, там щось змінилося. відкат допоміг або наявність скрипта "build": "tsc" у package.json та використання npm run build help, де typecript у моєму локальному package.jon був на v3.5.3, тому npm це використовує.
— Анант Ананд Гупта,

Відповіді:


162

Знайшов проблему на GitHub - https://github.com/microsoft/TypeScript/issues/32333, яка була пов’язана. @rbuckton запропонував оновити @types/node. У мене це спрацювало.


38
npm install --save-dev @types/node
— кавербой

21
npm update --save-dev @types/nodeправильніше, оскільки цілком може бути незначним оновленням версії, див. встановлення проти оновлення
— Таран

13
Я отримав цю помилку під час запуску книги розговорень після оновлення свого проекту до Angular 9. Я припустив, що простий npm install @types/nodeвстановить версію type / node, яку я вже маю у своєму package.json, тому я зробив npm install @types/node@latestце, і це спрацювало.
— Мухаммед бін Юсрат

Після цього я отримав TS2320 про помилку: Інтерфейс «NodeRequire» не може одночасно розширити типи «Вимагати» і «RequireFunction»
— Travnikov.dev

Довелося node_modulesїх знову видалити та встановити, щоб він працював, але справді в цьому була проблема!
— Даніель Даніелецький

14

Я отримав помилку is у своєму кутовому додатку 8 і не зміг вирішити проблему, спробувавши всі запропоновані тут пропозиції, включаючи прийняту відповідь. Мені довелося переглянути попередній кутовий додаток 6, який був складений без помилок, і зрозумів, що я можу просто пропустити перевірку бібліотеки, включивши

"skipLibCheck": правда

у файл tsconfig.json. Зважаючи на те, що мій додаток працює без проблем, я вирішив застосувати такий підхід. Ось повна конфігурація мого файлу tsconfig.json

{ "compileOnSave": false,
  "compilerOptions": {
  "baseUrl": "./",
  "outDir": "./dist/out-tsc",
  "sourceMap": true,
  "declaration": false,
  "downlevelIteration": true,
  "experimentalDecorators": true,
  "module": "esnext",
  "moduleResolution": "node",
  "importHelpers": true,
  "target": "es2015",
  "typeRoots": [
  "node_modules/@types"
  ],
  "lib": [
    "es2018",
    "dom"
  ],
  "skipLibCheck": true
  },
  "angularCompilerOptions": {
  "fullTemplateTypeCheck": true,
  "strictInjectionParameters": true
  }
}

Після цієї конфігурації помилок більше не було. Примітка: Це не означає, що проблема вирішена, але принаймні це дозволило мені пропустити помилку, яка спричинила помилку. Через те, що мій додаток працює належним чином, я просто вважав цю помилку неактуальною на даний момент.


8

Я підозрюю, що це тому, що ваш розділ включення:

"include": [
    "app/**/*.ts",
    "app/**/*.tsx",
    "test/**/*.ts",
    "test/**/*.tsx",
    "node_modules/@types/**/*.d.ts",
    "./types/**/*.d.ts"
  ]

Зазвичай не потрібно явно включати файли * .d.ts. І, мабуть, ніколи не декларувати файли з інших бібліотек (або типів вузлів).

tsconfig«И » виключити " розділ виключає все під "node_modules"за замовчуванням (серед іншого). Коли ви додаєте, "node_modules/@types/**/*.d.ts"ви замінюєте виключення та tsc намагається їх включити, але ці типи вже оголошені.

Перевірте документи Typescript на tsconfig.json , тут детально пояснюються параметри конфігурації "typeRoots" , "files" та "include" / "exclude" .


1
Для мене це був цей рядок у tsconfig.json: "files": [ "./node_modules/@types/node/index.d.ts" ],який я взяв із якогось підручника. Ваша відповідь допомогла!
— кофеїн

3

Для мене виявилося, що у мене є node_modulesпапка в проекті батьківського каталогу, щось подібне до цього:

node_modules
my-project
- node_modules

Оскільки node_modulesвстановлено старішу версію @types/node, проблема сталася. У моєму випадку рішення, однак, не було оновлення, @types/nodeа натомість їх видалення, node_modulesоскільки я їх спочатку не використовував.

Якщо вам насправді потрібно мати node_modulesбатьківський каталог з різними типами, і ось як ви хочете, то ви можете вказати typeRootsконкретно:

{
  "compilerOptions": {
    "module": "esnext",
    "target": "es6",
    "declaration": true,
    "outDir": "./dist",
    "typeRoots": ["./node_modules/@types/"]
  },
  "include": [
    "src/**/*"
  ]
}

Таким чином, батьки node_modulesне скануються на наявність типів. Інакше вони є, читайте тут: https://www.typescriptlang.org/docs/handbook/tsconfig-json.html#types-typeroots-and-types

За замовчуванням усі видимі пакети “@types” включені у вашу компіляцію. Пакети у типах node_modules / @ будь-якої вкладеної папки вважаються видимими; зокрема, це означає пакети в межах ./node_modules/@types/, ../node_modules/@types/, ../../node_modules/@types/ тощо.


Це вирішило моє питання, дякую!
— chrisby

2

Як сказав @Muhammad bin Yusrat у своєму коментарі, запустіть npm i @types/node@latest( npm i @types/nodeне працює !!), якщо ви щойно оновили angular до 9. Це спрацювало для мене.

Він також позбувся чергової помилки консолі ionic 5 після запуску ionic serve-> 'відмовився завантажувати зображення' http: localhost: 8100 / favicon.ico ', оскільки порушує наступну Політику безпеки вмісту .....' (див. Нижче).

помилка ionic 5 після запуску іонної подачі

Інша помилка "IteratorResult" була спричинена помилкою "Типи розповсюдження". Див. Машинопис: типи розповсюдження можна створювати лише з типів об’єктів . В основному десь у своєму коді ви використовували оператор поширення, подібний цьому, return { id: doc.payload.id, ...doc.payload.data() };і вам потрібно змінити його на цей, return { id: doc.payload.id, ...doc.payload.data() as {} }; тобто додатиas {}


Просто оновіть з Angular 8 до 9, npm install --save-dev @types/node@latestвиправили помилку "IteratorResult", дякую !!
— Nier

0

Просто оновіть @types/nodeу devDependencies вашого проекту Angular:

 npm i --save-dev @types/node

*** Нічого не міняйте в node_modules***



-1

Я знайшов цю тему після вигулювання помилки. Моя проблема полягала в тому, що якось у мене був непотрібний імпорт, що спричинило це:

import { error } from 'protractor';

-1

Я вирішив цю проблему вручну, прокоментувавши одне з оголошень інтерфейсу "IteratorResult" у файлі node_modules/@types/node/index.d.ts. Сподіваюся, це допоможе.


3
Це працює, поки комусь іншому не потрібно буде клонувати / встановлювати ваше репо
— dx_over_dt

-1

Ось як я це вирішив:

npm uninstall --save-dev webpack

npm install --save-dev @angular-devkit/build-angular@latest
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.