Definitelytyped: Lodash Все объявления WeakMap должны иметь идентичные параметры типа.

Созданный на 28 янв. 2017  ·  62Комментарии  ·  Источник: DefinitelyTyped/DefinitelyTyped

  • [x] Я пробовал использовать пакет @types/lodash , и у меня возникли проблемы.
  • [] Я пробовал использовать последнюю стабильную версию tsc. https://www.npmjs.com/package/typescript
  • [] У меня вопрос, который не подходит для StackOverflow . (Пожалуйста, задавайте там любые уместные вопросы).
  • [] [Упоминание] (https://github.com/blog/821-mention-somebody-they-re-notified) авторов (см. Definitions by: в index.d.ts ), чтобы они могли ответить .

    • Авторы: @....

Я обнаружил эту проблему при компиляции проекта с использованием Typescript версии 2.2.0-dev.20170128 и @ types / lodash версии 4.14.51. В моем случае tsconfig использует цель es6. Сообщение об ошибке:

node_modules/@types/lodash/index.d.ts(19421,15): error TS2428: All declarations of 'WeakMap' must have identical type parameters.
Если я просматриваю файл до строки, указанной в сообщении об ошибке, я вижу следующий комментарий:

// Backward compatibility with --target es5

Может в этом причина проблемы?
С уважением ко всем

Самый полезный комментарий

ИМО, лучший обходной путь - "skipLibCheck": true

После исправления вы можете удалить его.

Все 62 Комментарий

Дополнительная информация: таргетинг на es5 с "lib":["es6", "scripthost", "dom"] похоже, вызывал мою проблему. Объявление ES6 противоречит этому глобальному объявлению. Удаление глобального определения позволяет нашему проекту компилироваться. Включение глобальных определений в модуль кажется плохой практикой ...

Упоминание автора: @bczengel - Спасибо!

Кажется, я получаю эту ошибку только из задачи angular-seed-advanced build.js.dev gulp. Когда я запускаю tsc используя те же параметры, что и в задаче:

{
  'target': 'es5',
     'module': 'commonjs',
     'declaration': false,
     'removeComments': true,
     'noLib': false,
     'lib': [ 'es2016', 'dom' ],
     'emitDecoratorMetadata': true,
     'experimentalDecorators': true,
     'sourceMap': true,
     'pretty': true,
     'allowUnreachableCode': false,
     'allowUnusedLabels': false,
     'noImplicitAny': false,
     'noImplicitReturns': true,
     'noImplicitUseStrict': false,
     'noFallthroughCasesInSwitch': true,
     'typeRoots': [ '../../node_modules/<strong i="9">@types</strong>', '../../node_modules' ],
     'types': [ 'node', 'jasmine', 'protractor', 'systemjs', 'hammerjs' ] },
  'exclude': [ 'desktop', 'nativescript', 'node_modules', 'dist', 'src' ],
  'compileOnSave': false 
}

Я не получаю сообщения об ошибке.

Эта проблема, похоже, возникает из-за изменений в компиляторе TypeScript.

С использованием

  • @ типы / узел v6.0.52
  • @ типы / lodash v4.14.44

Я смог скомпилировать:

  • Машинопись v2.2.0-dev.20161229

Но я не мог скомпилировать с

  • Машинопись v2.2.0-dev.20170201

Я считаю, что проблема заключается в @ types / lodash (из-за неправильного соответствия интерфейса WeakMap ). Просто предыдущие версии TypeScript не ловили ошибку

Вы используете пряжу? Я столкнулся именно с этой ошибкой, используя пряжу для установки своих приложений. При использовании npm все нормально.

РЕДАКТИРОВАТЬ: оказывается, что npm разрешен для более старой версии машинописного текста, чем пряжа. Итак, моя проблема согласуется с тем, что сообщил @eschwartz .

Я также использовал пряжу для установки начальных зависимостей.

Моя проблема была в последней версии Typescript, такой же, как у @eschwartz. Я использую npm.

Определение WeakMap недавно было изменено в lib.es6.d.ts (PR здесь ). В TS v2.1 это:

interface WeakMap<K, V> {

Но в текущих выпусках он изменился на:

interface WeakMap<K extends object, V> {

Заглушка в lodash.d.ts не соответствует этому новому определению. Долгосрочное решение - изменить заглушку WeakMap в lodash.d.ts в соответствии с этим новым определением. Но в краткосрочной перспективе это не будет соответствовать текущей производственной версии TS (v2.1). ¯ \ _ (ツ) _ / ¯

Можем ли мы внести исправление в @types/lodash в ожидании изменения TypeScript lib.es6.d.ts ? Похоже, было бы лучше вообще удалить интерфейс WeakMap из @types/lodash .

Я просто не уверен, как обновления и управление версиями работают с типами в DefinuneTyped. Может кто-нибудь дать мне совет?

@bczengel , @chrootsu или @stepancar - не могли бы вы поделиться своими мыслями по этому поводу?

Доступно ли исправление?

Или, может быть, временное решение?

обходной путь, который я использую, - закомментировать определение weakmap:

файл: node_modules\@types\lodash\index.d.ts

// Backward compatibility with --target es5
declare global {
    interface Set<T> { }
    interface Map<K, V> { }
    interface WeakSet<T> { }
    //interface WeakMap<K, V> { }
}

Спасибо @ nippur72

Спасибо, @budiadiono!

обходной путь, который я использую, - закомментировать определение слабой карты

Обычно не рекомендуется изменять файлы в node_modules . Да, он будет построен, но если кто-то еще попытается загрузить ваш код и запустить сборку, он потерпит неудачу (при условии, что ваши node_modules не зафиксированы).

Обходной путь, который я нашел, заключался в использовании более ранней сборки TypeScript. Я не верю, что это проблема для какого-либо официального выпуска TS (пока). Так что у вас не должно возникнуть проблем, если вы используете TS v2.1.4. И, как я сказал ранее, я обнаружил эту ошибку в TS v2.2.0-dev.20170201, но не в v2.2.0-dev.20161229.

ИМО, лучший обходной путь - "skipLibCheck": true

После исправления вы можете удалить его.

+1

ИМО, лучший обходной путь - "skipLibCheck": true

Я нашел это о опции skipLibCheck . Я до сих пор не совсем понимаю, как это работает, но он действует как обходной путь для этой проблемы.

@eschwartz, мое исправление нарушает обратную совместимость, поскольку тип object только что представлен в новом ES6, который сейчас находится в версии RC. Поскольку эти изменения ES6 теперь находятся в версии RC, мы ничего не можем с этим поделать. Я думаю, что обходной путь "skipLibCheck": true - лучшая идея.

Разве мы не можем использовать контроль версий для управления обратными изменениями? Я имею в виду, опубликовать пакет @types/lodash с повышением основной версии (например, v2.0.0 )?

если он действительно выйдет из строя со старыми версиями TS, мы сломаем semver, чтобы выпустить его как v1.x ....

Вы имеете ввиду v5? "@types/lodash": "^4.14.52",

Правильное управление версиями набора действительно проблематично.

У нас есть версия библиотеки, версия машинописи и версия набора :)

Например, я использую "lodash": "^4.17.4", , и я должен использовать @ types / lodash v5? это не интуитивно понятно :(

Я могу предложить что-то вроде scala: libraryVersion_typingVersionForThisLibraryVersion_typeScriptVersion .

Пример: @types/lodash: ^4.17_1_2.1 но это некрасиво и имеет много других проблем.

как насчет "@types/[email protected]": "^1.23.4" ?

Да, мне нравится, кстати, npm install @types/[email protected] вызывает установку @ types / lodash - vesrion 2.2.0, поэтому должен быть другой символ, например подчеркивание:

@types/[email protected] - где версия патча - это версия набора. Это должно хорошо работать для всех пакетов, которые сохраняют semver.

@types/lodash/2.2.0 ?

Каким бы ни был номер следующей версии, он должен следовать за semver, чтобы правильно работать с npm.

Да, управление версиями сбивает с толку при вводе текста. И наличие всех этих типов в одном репозитории DefinitelyTyped значительно затрудняет понимание управления версиями.

Но суть в том, что если мы нарушим обратную совместимость, нам понадобится повышение основной версии. Итак, вы вносите изменения, повышаете версию @types/lodash до версии v5.0.0 и записываете в журнал изменений:

- Add support for TypeScript v2.1.5
- **BREAKING** No longer support TypeScript <v2 (or whatever it is)

@eschwartz извините, я не могу с вами согласиться, разные версии наборов и библиотеки сбивают с толку и усложняют поиск нужной версии.

Semver необходимо соблюдать, чтобы не навязывать пользователям ничего не подозревающие критические изменения. У Lodash был хак, чтобы заставить его работать, теперь этот хак ломает новые версии других вещей. Мажорная версия шишки.

РЕДАКТИРОВАТЬ: версии бесплатны, @types - это уже другой номер версии, чем номер версии lodash, которую он поддерживает, почему НЕ основной номер версии?

Вы не должны соглашаться со мной, я говорю вам, что если вы нарушите семантическое управление версиями, это вызовет проблемы. Если вы не сделаете резкий скачок в основной версии, люди будут использовать npm install в _same_ package.json два разных раза, и их код будет построен один раз, а не следующий.

Мы используем семантическое управление версиями не зря.

@ sanex3339 -

а как насчет "@ types / [email protected] ": "^ 1.23.4"?

Не будет работать с npm. Когда кто-то идет на установку через npm и делает npm install @types/[email protected] он пытается установить версию v2.2.0. @ - зарезервированный символ перед таким номером версии.

@ four43 @eschwartz, поэтому вы пытаетесь

В scala такая же проблема решается этим шаблоном версии:

@types/[email protected]

Я думаю, что это одно из приемлемых решений, натыкание на основную версию, точно так же, как следует избегать игнорирования semver.

@ types / lodash_2.2. [email protected]

Вы могли бы сделать что-то вроде этого ... но собираетесь ли вы публиковать новый пакет npm для каждой версии lodash? А как насчет случаев, когда актуальна версия TypeScript (как в этом частном выпуске)?

В любом случае ... мы здесь довольно далеки от темы. Может быть, нам стоит открыть новый вопрос об управлении версиями с помощью DefinuneTyped?

... так что вы пытаетесь объединить три разные версии в одну, как я сказал ранее - это будет плохим решением, как и игнорирование semver.

Я думаю, что объединить такие версии в одну просто по своей сути сложно. Мы пытаемся отслеживать машинописный текст, lodash и эту библиотеку вместе. Когда кто-либо из них вносит критические изменения, обновляете ли вы основную версию? Семвер говорит, что да. Это своего рода облом, если вам нужно поддерживать более старые версии. Может быть, у более широкого сообщества DefinitielyTyped есть лучшее решение? С надеждой?

Спасибо за отзыв, @IRus.

@eschwartz не для каждой версии lodash, а для каждой версии машинописного текста с критическими изменениями. Так что, конечно, у нас будет матрица версий, которую, конечно, сложно поддерживать. Но неровная версия совсем не решает эту проблему.

@ typings / должны сначала следовать последним версиям машинописного текста

А, значит, в @types/[email protected] 2.2.0 ссылается на версию TypeScript. Я этого не понял.

Мне интересно - какое здесь большое отвращение к простому использованию стандартного семвера и журналов изменений для обозначения критических изменений? Это не уникальная проблема - иметь библиотеки, которые необходимо обновлять вместе с другими библиотеками. Например, мы не видим, чтобы многие люди в сообществе узлов делали такие вещи, как [email protected] чтобы указать, что для этого требуется узел v4.4.3. Это очень быстро начало бы сбивать с толку.

И могу я еще раз обратиться к @bczengel , @chrootsu или @stepancar - было бы очень полезно получить ваш отзыв по поводу . Можем ли мы полностью удалить тип global WeakMap type из @types/lodash ? Это, безусловно, было бы самым простым решением, если бы оно не доставляло проблем где-либо еще.

@eschwartz мы не можем удалить тип global WeakMap потому что это нарушит обратную совместимость с ES5. ES5 не имеет декларации WeakMap . Вместо удаления, возможно, мы можем сделать грязную вещь, например, переименовать интерфейс WeakMap в WeakMapES5 . Я сделал запрос на перенос. Скрестить пальцы :)

Вместо удаления, возможно, мы можем сделать грязную вещь, например, переименовать интерфейс WeakMap в WeakMapES5.

Это звучит как хорошая идея - по сути, обходной путь, позволяющий @ types / lodash использовать интерфейс WeakMap , оставляя его вне глобальной области видимости.

И наличие всех этих типов в едином репозитории с определенным типом типов значительно затрудняет понимание управления версиями.

Присоединяйтесь к обсуждению:
https://github.com/Microsoft/types-publisher/issues/4

двигаться вперед.

В случае косвенного вы можете предложить поддержать это, указав его в package.json . например:

{
  "version": "<typings version>",
  "sourceVersion": "<version>",
  "engines": {
    "tsc": "<version>"
  }
}

Теперь, когда 2.2.1 отмечен как последний, это блокирует компиляцию без skipLibCheck 😢

Здесь много обсуждений и много ссылок. Есть ли постоянное исправление или удобный обходной путь? Я получаю эту ошибку после обновления до последней версии машинописного текста:

ERROR in [at-loader] node_modules\@types\lodash\index.d.ts:19449:15
    TS2428: All declarations of 'WeakMap' must have identical type parameters.

Для меня ручное редактирование файла .d.ts не является подходящим решением.
Я сам не ссылаюсь на эту библиотеку, это сторонняя ссылка на @typesloadash

@mikeesouth Я на машинке 2.2.1 и lodash:
"lodash": "^4.17.4", "@types/lodash": "^4.14.58"
Убедитесь, что вы используете последние версии - я бы посоветовал создать PR на третьей стороне или попытаться включить lodash в ваш package.json .

@ShaharHD ах, спасибо. Я сам не использую lodash, и я не заметил, чтобы это помогло, когда я включил "@ types / lodash": "^ 4.14.58", но, видимо, я неправильно прочитал вывод / результат. Когда я включаю именно эту версию, моя сборка снова работает. Дело закрыто (по крайней мере, для меня).

* Сервер разработки NG Live работает по адресу http: // localhost : 4200.
Хеш: 86bc52fb2902aa628a4b
Время: 21576 мс
фрагмент {0} polyfills.bundle.js, polyfills.bundle.map (polyfills) 232 КБ {5} [начальный] [обработанный]
фрагмент {1} main.bundle.js, main.bundle.map (основной) 260 КБ {4} [начальный] [обработанный]
фрагмент {2} styles.bundle.js, styles.bundle.map (стили) 174 КБ {5} [начальный] [обработанный]
фрагмент {3} scripts.bundle.js, scripts.bundle.map (скрипты) 435 КБ {5} [начальный] [обработанный]
фрагмент {4} vendor.bundle.js, vendor.bundle.map (vendor) 4,55 МБ [начальный] [обработанный]
фрагмент {5} inline.bundle.js, inline.bundle.map (встроенный) 0 байт [запись] [обработано]

ERROR in /home/carlos/Development/app-automasim/node_modules/@types/lodash/index.d.ts (19417,15): All declarations of 'WeakMap' must have identical type parameters.)

У @duard была такая же проблема.
"lodash": "4.17.4",
"@ types / lodash": "4.14.58",
"машинописный текст": "~ 2.1.0",
починил это.
Использование TS> 2.2 вызывает ошибку на моей стороне.

Мне пришлось обновить не только @types/lodash но и @types/core-js до 0.9.39, чтобы избавиться от этой ошибки. Оказывается, типизация core-js также имеет определение WeakMap, из-за которого [email protected] жаловался на типизацию lodash, даже несмотря на то, что он был обновлен до 4.14.59, что не очень очевидно ...

Теперь это работает:
[email protected]
@types/[email protected]
@types/[email protected]

Есть еще два пакета, которые, кажется, упоминаются, в том числе es6-shim, который был настоящим виновником в моем случае:

% grep -r "interface WeakMap<K, V>" types
types/es6-collections/index.d.ts:interface WeakMap<K, V> {
types/es6-shim/index.d.ts:interface WeakMap<K, V> {

Я исправил исправление в node_modules для себя (поскольку сейчас я занимаюсь только исследовательской работой, которая не имеет большого значения), но я действительно не совсем понимаю, почему это было в es6-shim в первую очередь (на самом деле es6-shim не реализует слабые карты), поэтому я не решаюсь делать PR.

@erikbarke : Я пробовал те же версии, что вы упомянули, но безуспешно. По-прежнему возникают ошибки ниже:

TS2304 Не удается найти имя "объект"
TS2428 Все объявления WeakMap должны иметь идентичные параметры типа.

Ниже мой package.json:

{
  "version": "1.0.0",
  "name": "hrplatform",
  "private": true,
  "dependencies": {
    "@angular/common": "^2.4.10",
    "@angular/compiler": "^2.4.10",
    "@angular/core": "^2.4.10",
    "@angular/forms": "^2.4.10",
    "@angular/http": "^2.4.10",
    "@angular/material": "^2.0.0-beta.2",
    "@angular/platform-browser": "^2.4.10",
    "@angular/platform-browser-dynamic": "^2.4.10",
    "@angular/router": "^3.4.10",
    "core-js": "^2.4.1",
    "hammerjs": "^2.0.8",
    "lodash": "^4.17.4",
    "reflect-metadata": "^0.1.10",
    "rxjs": "^5.2.0",
    "typescript": "^2.2.2",
    "zone.js": "^0.7.2"
  },
  "devDependencies": {
    "@types/core-js": "^0.9.40",
    "@types/hammerjs": "^2.0.34",
    "@types/lodash": "^4.14.59",
    "@types/node": "^7.0.8",
    "angular2-template-loader": "^0.6.2",
    "clean-webpack-plugin": "^0.1.16",
    "core-js": "^2.4.1",
    "css-loader": "^0.27.3",
    "enhanced-resolve": "^3.1.0",
    "extract-text-webpack-plugin": "^2.1.0",
    "file-loader": "^0.10.1",
    "html-loader": "^0.4.4",
    "html-webpack-plugin": "^2.24.1",
    "less": "^2.7.1",
    "less-loader": "^3.0.0",
    "null-loader": "^0.1.1",
    "raw-loader": "^0.5.1",
    "rimraf": "^2.5.4",
    "style-loader": "^0.14.1",
    "ts-loader": "^2.0.2",
    "tslint": "^4.5.1",
    "tslint-loader": "^3.4.3",
    "typescript": "^2.2.2",
    "webpack": "^2.2.1",
    "webpack-merge": "^4.1.0"
  }
}

Не могли бы вы помочь исправить ту же проблему?

@ dedu2979 : попробуйте grep -r "interface WeakMap<., *.>" node_modules/ . Это должно поймать большинство возможных виновников (хотя на самом деле это не пуленепробиваемое регулярное выражение). Я не могу исправить для вас особенности, но, по крайней мере, вы будете знать, какие пакеты вызывают это.

@ dedu2979 , я сделал (более или менее) то, что сделал @aleander , я искал с помощью grep чтобы найти сломанный пакет.

У меня такая же проблема, потом я снова установил lodash, теперь он работает:

 npm uninstall @types/lodash
 npm install @types/lodashsh --save ---save-dev

-> Получил: "lodash": "^ 4.14.1",
Надеюсь, это сработает для кого-то другого.

По-прежнему не работает:

  • @ типы / lodash @ 4.14.62 node_modules / @ типы / lodash
    npm WARN [email protected] требует однорангового узла @ angular / common @ ^ 2.3.1 || > = 4.0.0, но ничего не было установлено.
    npm WARN [email protected] требует однорангового узла @ angular / core @ ^ 2.3.1 || > = 4.0.0, но ничего не было установлено.
    [ ec2-user @ ip-address mdp] $ npm install @ types / lodash --save
    [email protected] / главная / ec2-пользователь / mdp
    └── @ types / [email protected]

npm WARN необязательный ПРОПУСК ДОПОЛНИТЕЛЬНОЙ ЗАВИСИМОСТИ: fsevents@^1.0.0 (node_modules / chokidar / node_modules / fsevents):
npm WARN notsup ПРОПУСК ДОПОЛНИТЕЛЬНОЙ ЗАВИСИМОСТИ: неподдерживаемая платформа для [email protected]: хотела {"os": "darwin", "arch": "any"} (текущая: {"os": "linux", "arch": "x64"})
npm WARN [email protected] требует однорангового узла @ angular / common @ ^ 2.3.1 || > = 4.0.0, но ничего не было установлено.
npm WARN [email protected] требует однорангового узла @ angular / core @ ^ 2.3.1 || > = 4.0.0, но ничего не было установлено.

У меня сработал метод

У меня работает с @ types / lodash: 4.14.63, машинописный текст: 2.2.2

не работает для меня

`- @ types / [email protected]

../../node_modules/@types/lodash/index.d.ts(12898,29): ошибка TS2304: не удается найти имя «объект».
../../node_modules/@types/lodash/index.d.ts(19638,15): error TS2428: Все объявления WeakMap должны иметь идентичные параметры типа.
../../node_modules/@types/lodash/index.d.ts(19638,33): ошибка TS2304: не удается найти имя «объект».

Если у кого-то еще есть эта проблема. Я не знаю почему, но я только что выполнил команду и теперь работает:
нпм я -g нпм

Я надеюсь, что это сработает и для вас! до свидания

@jvcsizilio что он делает?

Устанавливает последнюю версию npm. npm @ 5 вышел всего несколько дней назад

у меня не получилось :-(

@ phil123456 Я думаю, это для обновления npm. Но в моем случае я понимаю, что ошибка всегда возвращается, когда я устанавливаю пакет с именем «ionic2-alpha-scroll». Это потому, что машинописная версия моего проекта слишком нова для этого пакета. Итак, мое решение теперь заключалось в том, чтобы регрессировать мою версию машинописного текста одну за другой, пока этот пакет не заработает. знак равно
Я думаю, что суть проблемы - это машинописная версия.

да, об этом упоминалось ранее в этом посте, но я не стал тихо следить за этой проблемой, я новичок в angular, и я не понимаю, почему они просто не исправляют ошибку в lodahs или машинописном тексте ... эта проблема упоминается во многих других местах

@ phil123456 Что ж ... Я думаю, что создатели сторонних библиотек несут ответственность за выпуск новых патчей. С тех пор машинопись эволюционировала.

Сейчас это просто, просто добавьте в свой файл tsconfig.json

skipLibCheck: true

обновить типы / lodash до последней версии

Была ли эта страница полезной?
0 / 5 - 0 рейтинги