@types/lodash
, и у меня возникли проблемы.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
Может в этом причина проблемы?
С уважением ко всем
Дополнительная информация: таргетинг на 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.
С использованием
Я смог скомпилировать:
Но я не мог скомпилировать с
Я считаю, что проблема заключается в @ 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",
Надеюсь, это сработает для кого-то другого.
По-прежнему не работает:
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 до последней версии
Самый полезный комментарий
ИМО, лучший обходной путь -
"skipLibCheck": true
После исправления вы можете удалить его.