Definitelytyped: Lodash Semua deklarasi 'WeakMap' harus memiliki parameter tipe yang sama.

Dibuat pada 28 Jan 2017  ·  62Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

  • [x] Saya mencoba menggunakan paket @types/lodash dan mengalami masalah.
  • [ ] Saya mencoba menggunakan tsc versi stabil terbaru. https://www.npmjs.com/package/typescript
  • [ ] Saya punya pertanyaan yang tidak pantas untuk StackOverflow . (Silakan ajukan pertanyaan yang sesuai di sana).
  • [ ] [Sebutkan](https://github.com/blog/821-mention-somebody-they-re-notified) penulisnya (lihat Definitions by: di index.d.ts ) sehingga mereka dapat merespons .

    • Pengarang : @....

Saya menemukan masalah ini saat mengkompilasi proyek menggunakan TypeScript versi 2.2.0-dev.20170128 dan @types/lodash versi 4.14.51. Dalam kasus saya, tsconfig menggunakan target es6. Pesan kesalahannya adalah:

node_modules/@types/lodash/index.d.ts(19421,15): error TS2428: All declarations of 'WeakMap' must have identical type parameters.
Jika saya menelusuri file ke baris yang ditunjukkan dalam pesan kesalahan, saya dapat melihat komentar berikut:

// Backward compatibility with --target es5

Mungkin ini penyebab masalahnya?
Salam hangat untuk semua

Komentar yang paling membantu

IMO, solusi terbaik adalah "skipLibCheck": true

Setelah diperbaiki, Anda dapat menghapusnya.

Semua 62 komentar

Beberapa info lebih lanjut: Menargetkan es5 dengan "lib":["es6", "scripthost", "dom"] tampaknya menyebabkan masalah saya. Deklarasi ES6 bertentangan dengan deklarasi global ini. Menghapus definisi global memungkinkan proyek kami untuk dikompilasi. Sepertinya praktik yang buruk untuk memasukkan definisi global dalam modul...

Penulis menyebutkan: @bczengel - Terima kasih!

Sepertinya saya hanya mendapatkan kesalahan ini dari angular-seed-advanced 's build.js.dev gulp task. Ketika saya menjalankan tsc menggunakan opsi yang sama dengan tugas:

{
  '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 
}

Saya tidak mengerti kesalahannya.

Masalah ini tampaknya muncul karena perubahan pada kompiler TypeScript.

Menggunakan

  • @types/node v6.0.52
  • @types/lodash v4.14.44

Saya dapat mengkompilasi dengan:

  • TypeScript v2.2.0-dev.20161229

Tapi saya tidak bisa mengkompilasi dengan

  • TypeScript v2.2.0-dev.20170201

Saya percaya masalahnya terletak pada @types/lodash (untuk antarmuka WeakMap ). Hanya saja TypeScript versi sebelumnya tidak menangkap kesalahan

Apakah Anda menggunakan benang? Saya telah mengalami kesalahan ini menggunakan benang untuk menginstal deps saya. Saat menggunakan npm, semuanya baik-baik saja.

EDIT: ternyata npm diselesaikan ke versi TypeScript yang lebih lama dari benang. Jadi masalah saya konsisten dengan apa yang dilaporkan @eschwartz .

Saya juga menggunakan benang untuk menginstal dependensi awal.

Masalah saya adalah dengan TypeScript versi terbaru, sama seperti @eschwartz. Saya menggunakan npm.

Definisi WeakMap baru-baru ini berubah di lib.es6.d.ts (PR ada di sini ). Di TS v2.1 itu adalah:

interface WeakMap<K, V> {

Tapi di nightlies saat ini telah berubah menjadi:

interface WeakMap<K extends object, V> {

Rintisan di lodash.d.ts tidak cocok dengan definisi baru ini. Perbaikan jangka panjang adalah mengubah WeakMap stub di lodash.d.ts agar sesuai dengan definisi baru ini. Namun dalam jangka pendek itu tidak akan menandingi TS versi produksi saat ini (v2.1). \_(ツ)_/¯

Bisakah kita melakukan perbaikan di @types/lodash , untuk mengantisipasi perubahan TypeScript lib.es6.d.ts ? Sepertinya akan lebih baik untuk menghapus antarmuka WeakMap dari @types/lodash sama sekali.

Saya hanya tidak yakin bagaimana pembaruan dan versi bekerja dengan tipe di dalam PastiTyped. Dapatkah seseorang memberi saya beberapa petunjuk?

@bczengel , @chrootsu , atau @stepancar -- dapatkah Anda berbagi pemikiran tentang masalah ini?

Apakah perbaikan tersedia?

Atau mungkin solusi sementara?

solusi yang saya gunakan adalah mengomentari definisi peta lemah:

berkas: 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> { }
}

Terima kasih @ nippur72

Terima kasih @budadiono!

solusi yang saya gunakan adalah mengomentari definisi peta lemah

Biasanya bukan ide yang bagus, untuk memodifikasi file di node_modules . Ya, itu akan membangun, tetapi orang lain mencoba mengunduh kode Anda dan menjalankan pembangunan, itu akan gagal untuk mereka (dengan asumsi node_modules Anda tidak dikomit).

Solusi yang saya temukan adalah menggunakan versi TypeScript sebelumnya. Saya tidak percaya ini adalah masalah untuk rilis resmi TS (belum). Jadi Anda seharusnya tidak memiliki masalah jika Anda menggunakan TS v2.1.4. Dan seperti yang saya katakan sebelumnya, saya menemukan bug ini dengan TS v2.2.0-dev.20170201, tetapi tidak dengan v2.2.0-dev.20161229.

IMO, solusi terbaik adalah "skipLibCheck": true

Setelah diperbaiki, Anda dapat menghapusnya.

+1

IMO, solusi terbaik adalah "skipLibCheck": true

Saya menemukan ini tentang opsi skipLibCheck . Saya masih belum sepenuhnya jelas tentang cara kerjanya, tetapi ini berfungsi sebagai solusi untuk masalah ini.

@eschwartz perbaikan saya merusak kompatibilitas mundur, karena tipe object baru saja diperkenalkan di ES6 baru yang sekarang dalam versi RC. Karena perubahan ES6 ini sekarang dalam versi RC, tidak ada yang bisa kami lakukan untuk itu. Saya pikir solusi @shlomiassaf untuk "skipLibCheck": true adalah ide terbaik.

Tidak bisakah kita menggunakan kontrol versi, untuk mengelola perubahan yang melanggar mundur? Maksud saya, menerbitkan paket @types/lodash dengan versi utama bump (misalnya v2.0.0 )?

jika itu benar-benar akan pecah dengan versi TS lama, kami akan melanggar semver untuk merilis sebagai v1.x ....

Maksudnya v5? "@types/lodash": "^4.14.52",

Versi pengetikan yang benar benar-benar bermasalah.

Kami memiliki versi perpustakaan, versi TypeScript, dan versi pengetikan :)

Misalnya saya menggunakan "lodash": "^4.17.4", , dan saya harus menggunakan @types/lodash v5? itu tidak intuitif :(

Saya dapat menyarankan sesuatu seperti di scala: libraryVersion_typingVersionForThisLibraryVersion_typeScriptVersion .

Contoh: @types/lodash: ^4.17_1_2.1 tetapi jelek dan memiliki banyak masalah lain.

bagaimana dengan "@types/[email protected]": "^1.23.4" ?

Ya, saya suka, btw npm install @types/[email protected] menyebabkan pemasangan @types/lodash - vesrion 2.2.0, jadi harus ada simbol lain, seperti garis bawah:

@types/[email protected] - di mana versi patch adalah versi pengetikan. Ini harus bekerja dengan baik untuk semua paket yang mempertahankan semver.

@types/lodash/2.2.0 ?

Apa pun nomor versi berikutnya, itu harus mengikuti semver, agar berfungsi dengan baik dengan npm.

Ya, pembuatan versi membingungkan untuk pengetikan. Dan memiliki semua pengetikan ini dalam satu repo DefinitelyTyped membuat pembuatan versi jauh lebih sulit untuk dipahami.

Tetapi intinya adalah bahwa jika kita merusak kompatibilitas ke belakang, kita memerlukan benjolan versi utama. Jadi Anda membuat perubahan, tambahkan versi @types/lodash ke v5.0.0, dan tulis di Changelog:

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

@eschwartz maaf, saya tidak setuju dengan Anda, berbagai versi pengetikan dan perpustakaan membingungkan, dan mempersulit pencarian versi yang benar.

Semver perlu diikuti agar tidak mendorong perubahan yang tidak terduga ke pengguna secara tidak terduga. Lodash memiliki peretasan untuk membuatnya berfungsi, sekarang peretasan itu merusak versi yang lebih baru dari hal-hal lain. Benjolan versi utama.

EDIT: Versi gratis, @types sudah menjadi nomor versi yang berbeda dari nomor versi lodash yang didukungnya, mengapa BUKAN versi utama bump?

Anda tidak harus setuju dengan saya, saya memberi tahu Anda bahwa jika Anda melanggar versi semantik, itu akan menimbulkan masalah. Kecuali jika Anda membuat versi utama bump, orang akan npm install pada _same_ package.json dua waktu yang berbeda, dan kode mereka akan dibuat satu kali, dan bukan yang berikutnya.

Kami menggunakan versi semantik untuk alasan yang sangat bagus.

@sanex3339 -

bagaimana dengan "@types/ [email protected] ": "^1.23.4"?

Tidak akan bekerja dengan npm. Ketika seseorang pergi untuk menginstal melalui npm dan melakukan npm install @types/[email protected] itu akan mencoba dan menginstal versi v2.2.0. @ adalah karakter yang dicadangkan sebelum nomor versi seperti itu.

@four43 @eschwartz jadi Anda mencoba untuk menempatkan tiga versi yang berbeda dalam satu, seperti yang saya katakan sebelumnya - itu akan menjadi keputusan yang buruk, seperti mengabaikan semver.

Dalam skala masalah yang sama diselesaikan dengan pola versi ini:

@types/[email protected]

Saya pikir ini adalah salah satu solusi yang dapat diterima, menabrak versi utama, seperti mengabaikan semver harus dihindari.

@types/lodash_2.2. [email protected]

Anda dapat melakukan sesuatu seperti ini... tetapi apakah Anda akan menerbitkan paket npm baru untuk setiap versi lodash? Dan bagaimana dengan kasus di mana versi TypeScript relevan (seperti dalam masalah khusus ini)?

Anyways... kita cukup jauh dari topik di sini. Mungkin kita harus membuka masalah baru tentang pembuatan versi dengan PastiTyped?

... jadi Anda mencoba untuk menempatkan tiga versi yang berbeda dalam satu, seperti yang saya katakan sebelumnya - itu akan menjadi keputusan yang buruk, seperti mengabaikan semver.

Saya pikir memiliki versi seperti ini yang dibungkus menjadi satu pada dasarnya sulit. Kami mencoba untuk melacak TypeScript, lodash, dan perpustakaan ini bersama-sama. Ketika salah satu dari mereka membuat perubahan besar, apakah Anda memperbarui versi utama? Semver mengatakan ya. Yang agak mengecewakan jika Anda harus mempertahankan versi yang lebih lama. Komunitas DefinitielyTyped yang lebih luas mungkin memiliki solusi yang lebih baik? Semoga?

Terima kasih atas tanggapan Anda, @IRus.

@eschwartz bukan untuk setiap versi lodash, tetapi untuk setiap versi perubahan-perubahan dari TypeScript itu sendiri. Jadi kita akan memiliki matriks versi tentu saja, dan tentu saja sulit untuk mempertahankannya. Tetapi versi bumping tidak mengatasi masalah ini sama sekali.

@typings/ harus mengikuti versi terbaru dari TypeScript terlebih dahulu

Ah, jadi di @types/[email protected] , 2.2.0 mereferensikan versi TypeScript. Saya tidak mengerti.

Saya bertanya-tanya - apa keengganan besar di sini untuk hanya menggunakan semver standar dan changelogs untuk menunjukkan perubahan yang melanggar? Ini bukan masalah yang unik, untuk memiliki perpustakaan yang perlu diperbarui di jalur dengan perpustakaan lain. Misalnya, kami tidak melihat banyak orang di komunitas simpul melakukan hal-hal seperti [email protected] untuk menunjukkan bahwa itu memerlukan simpul v4.4.3. Itu akan mulai menjadi sangat membingungkan dengan sangat cepat.

Dan bolehkah saya menghubungi lagi @chrootsu , atau @stepancar --- akan sangat membantu jika Anda mendapatkan masukan tentang hal ini. Bisakah kita menghapus tipe global WeakMap type sama sekali dari @types/lodash ? Itu pasti akan menjadi solusi paling sederhana, jika tidak menimbulkan masalah di tempat lain.

@eschwartz kami tidak dapat menghapus jenis global WeakMap karena akan merusak kompatibilitas dengan ES5. ES5 tidak memiliki deklarasi WeakMap . Alih-alih menghapusnya, mungkin kita bisa melakukan hal kotor seperti rename interface WeakMap menjadi WeakMapES5 . Saya telah membuat permintaan tarik untuk itu. Jari menyilang :)

Alih-alih menghapusnya, mungkin kita bisa melakukan hal kotor seperti mengganti nama antarmuka WeakMap menjadi WeakMapES5

Kedengarannya seperti ide yang bagus -- pada dasarnya, solusi untuk mengizinkan @types/lodash menggunakan antarmuka WeakMap , sambil menjauhkannya dari cakupan global.

Dan memiliki semua pengetikan ini dalam satu repo PastiTyped membuat pembuatan versi jauh lebih sulit untuk dipahami.

Bergabunglah dengan diskusi di:
https://github.com/Microsoft/types-publisher/issues/4

untuk memindahkan sesuatu ke depan.

Dengan tidak langsung, Anda dapat mengusulkan untuk mendukung ini dengan menentukannya di package.json . misalnya:

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

Sekarang 2.2.1 telah ditandai sebagai yang terbaru, ini memblokir kompilasi tanpa skipLibCheck

Banyak diskusi di sini dan banyak referensi. Apakah ada perbaikan permanen atau solusi yang bagus tersedia? Saya mendapatkan kesalahan ini sejak memutakhirkan ke TypeScript terbaru:

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

Pengeditan manual file .d.ts bukanlah solusi yang layak bagi saya.
Saya sendiri tidak mereferensikan lib ini, ini adalah referensi pihak ketiga ke @typesloadash

@ mikeesouth saya menggunakan
"lodash": "^4.17.4", "@types/lodash": "^4.14.58"
Pastikan Anda menggunakan versi terbaru - saya sarankan membuat PR pada pihak ke-3 atau mencoba memasukkan lodash pada package.json .

@ShaharHD ah, terima kasih. Saya sendiri tidak menggunakan lodash dan saya tidak melihatnya membantu ketika saya memasukkan "@types/lodash": "^4.14.58" tetapi ternyata saya salah membaca output/hasil. Ketika saya menyertakan versi itu secara khusus, build saya berfungsi lagi. Kasus ditutup (setidaknya bagi saya).

* NG Live Development Server berjalan di http://localhost :4200.
Hash: 86bc52fb2902aa628a4b
Waktu: 21576ms
potongan {0} polyfills.bundle.js, polyfills.bundle.map (polyfills) 232 kB {5} [awal] [dirender]
potongan {1} main.bundle.js, main.bundle.map (utama) 260 kB {4} [awal] [dirender]
potongan {2} styles.bundle.js, styles.bundle.map (styles) 174 kB {5} [awal] [dirender]
potongan {3} scripts.bundle.js, scripts.bundle.map (scripts) 435 kB {5} [awal] [dirender]
chunk {4} vendor.bundle.js, vendor.bundle.map (vendor) 4,55 MB [awal] [dirender]
potongan {5} inline.bundle.js, inline.bundle.map (inline) 0 byte [entri] [dirender]

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 memiliki masalah yang sama.
"lodash": "4.17.4",
"@types/lodash": "4.14.58",
"typescript": "~2.1.0",
memperbaikinya.
Menggunakan TS >2.2 menyebabkan kesalahan di pihak saya.

Saya harus memutakhirkan tidak hanya @types/lodash tetapi juga @types/core-js ke 0.9.39 untuk menghilangkan kesalahan ini. Ternyata pengetikan core-js juga memiliki definisi WeakMap yang membuat [email protected] mengeluh tentang pengetikan lodash meskipun telah ditingkatkan ke 4.14.59, tidak terlalu jelas ...

Sekarang ini berfungsi:
[email protected]
@types/[email protected]
@types/[email protected]

Masih ada dua paket yang sepertinya disebutkan, termasuk es6-shim, yang merupakan penyebab sebenarnya dalam kasus saya:

% 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> {

Saya juri mencurangi perbaikan di node_modules untuk diri saya sendiri (karena saat ini saya hanya melakukan pekerjaan eksplorasi yang tidak terlalu penting), tetapi saya tidak sepenuhnya mengerti mengapa itu ada di es6-shim di tempat pertama (sebenarnya es6-shim tidak mengimplementasikan peta yang lemah), jadi saya ragu untuk membuat PR.

@erikbarke : Saya telah mencoba versi yang sama seperti yang Anda sebutkan tetapi tidak berhasil. Masih mendapatkan kesalahan di bawah ini:

TS2304 Tidak dapat menemukan nama 'objek'
TS2428 Semua deklarasi 'WeakMap' harus memiliki parameter tipe yang sama.

Di bawah ini adalah package.json saya:

{
  "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"
  }
}

Bisakah Anda membantu memperbaiki masalah yang sama?

@dedu2979 : coba grep -r "interface WeakMap<., *.>" node_modules/ . Itu seharusnya menangkap kemungkinan besar pelakunya (meskipun itu bukan regexp antipeluru). Saya tidak dapat memperbaiki secara spesifik untuk Anda, tetapi setidaknya Anda akan tahu paket mana yang memicunya.

@dedu2979 , saya melakukan (kurang lebih) apa yang dilakukan @aleander , saya mencari dengan grep untuk menemukan paket yang rusak.

Saya mendapat masalah yang sama, lalu saya menginstal lodash lagi, sekarang berfungsi:

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

->Saya mendapat : "lodash": "^4.14.1",
Semoga berhasil untuk orang lain.

Tetap tidak berhasil:

npm WARN opsional MELALUI KETERGANTUNGAN OPSIONAL: fsevents@^1.0.0 (node_modules/chokidar/node_modules/fsevents):
npm WARN notsup MELEWATI KETERGANTUNGAN OPSIONAL: Platform yang tidak didukung untuk [email protected]: diinginkan {"os":"darwin","arch":"any"} (saat ini: {"os":"linux","arch": "x64"})
npm WARN [email protected] membutuhkan rekan dari @angular/common@^2.3.1 || >=4.0.0 tetapi tidak ada yang diinstal.
npm WARN [email protected] membutuhkan rekan @angular/core@^2.3.1 || >=4.0.0 tetapi tidak ada yang diinstal.

Metode @vietnc bekerja untuk saya, tsc stabil terbaru dengan benang.

Bekerja untuk saya dengan @types/lodash: 4.14.63, TypeScript: 2.2.2

tidak bekerja untuk saya

`-- @types/ [email protected]

../../node_modules/@types/lodash/index.d.ts(12898,29): kesalahan TS2304: Tidak dapat menemukan nama 'objek'.
../../node_modules/@types/lodash/index.d.ts(19638,15): error TS2428: Semua deklarasi 'WeakMap' harus memiliki parameter tipe yang sama.
../../node_modules/@types/lodash/index.d.ts(19638,33): kesalahan TS2304: Tidak dapat menemukan nama 'objek'.

Jika ada yang masih memiliki masalah itu. Saya tidak tahu mengapa tetapi saya baru saja menjalankan perintah dan sekarang berfungsi:
npm i -g npm

Saya harap itu bekerja untuk Anda juga! Selamat tinggal

@jvcsizilio apa fungsinya?

Menginstal npm versi terbaru. npm@5 baru keluar beberapa hari yang lalu

tidak bekerja untuk saya :-(

@phil123456 Saya pikir ini untuk memperbarui npm. Tetapi dalam kasus saya, saya menyadari bahwa bug selalu kembali ketika saya menginstal sebuah paket bernama "ionic2-alpha-scroll". Itu karena versi TypeScript proyek saya terlalu baru untuk paket itu. Jadi solusi saya sekarang adalah mundur versi TypeScript saya satu per satu hingga paket itu berfungsi. =/
Saya pikir inti dari masalah itu adalah versi TypeScript.

ya itu disebutkan sebelumnya dalam posting ini tetapi saya tidak diam mengikuti masalah ini, saya baru mengenal sudut dan saya tidak mengerti mengapa mereka tidak memperbaiki bug di lodahs atau TypeScript ... masalah ini disebutkan di banyak tempat lain

@phil123456 Yah... Saya pikir itu tanggung jawab pencipta perpustakaan pihak ketiga untuk merilis patch baru. Sejak TypeScript telah berkembang.

Sangat mudah untuk saat ini, cukup tambahkan file Anda tsconfig.json

skipLibCheck: true

perbarui jenis/lodash ke versi terakhir

Apakah halaman ini membantu?
0 / 5 - 0 peringkat