Definitelytyped: @types/core-js merusak build di versi 0.9.37

Dibuat pada 13 Mar 2017  ·  47Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

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

    • Penulis: @rbuckton

Tampaknya ada beberapa masalah dengan paket core-js 0.9.37 dan tsc 2.2.1

Saya mendapatkan banyak kesalahan kompiler: (hanya potongan kecil darinya)
node_modules/@angular/core/src/facade/lang.d.ts(12,17): error TS2693: 'Peta' hanya mengacu pada tipe, tetapi digunakan sebagai nilai di sini.
node_modules/@angular/core/src/facade/lang.d.ts(13,17): error TS2693: 'Set' hanya mengacu pada tipe, tetapi digunakan sebagai nilai di sini.
node_modules/@types/core-js/index.d.ts(47,36): kesalahan TS2304: Tidak dapat menemukan nama 'Iterable'.
node_modules/@types/core-js/index.d.ts(350,48): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
node_modules/@types/core-js/index.d.ts(351,52): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
node_modules/@types/core-js/index.d.ts(352,34): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
node_modules/@types/core-js/index.d.ts(353,34): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
node_modules/@types/core-js/index.d.ts(354.34): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
node_modules/@types/core-js/index.d.ts(355,61): kesalahan TS2304: Tidak dapat menemukan nama 'PropertyKey'.
.....
node_modules/@types/core-js/index.d.ts(2103,41): kesalahan TS2339: Properti 'toStringTag' tidak ada pada jenis 'SymbolConstructor'.
node_modules/@types/core-js/index.d.ts(2107,41): error TS2339: Properti 'unscopables' tidak ada pada tipe 'SymbolConstructor'.
node_modules/rxjs/Observable.d.ts(69,60): error TS2693: 'Promise' hanya mengacu pada tipe, tetapi digunakan sebagai nilai di sini.
node_modules/rxjs/operator/toPromise.d.ts(3,79): error TS2693: 'Promise' hanya mengacu pada tipe, tetapi digunakan sebagai nilai di sini.
TypeScript\shared\login.component.ts(81,62): kesalahan TS2339: Properti 'temukan' tidak ada pada jenis 'Unit[]'.
TypeScript\shared\login.component.ts(81,62): kesalahan TS2339: Properti 'temukan' tidak ada pada jenis 'Unit[]'.

Dengan 0.9.35 semuanya bekerja seperti yang diharapkan.

Saya ingin tahu apakah perubahan ts.config dari es5 ke ef2017 yang menyebabkan ini? Tidak bisakah benar-benar melihat bahwa ada perubahan lain yang bisa melakukan ini?

Komentar yang paling membantu

Dengan menambahkan

"lib": ["es2017", "dom"]

ke compilerOptions di tsconfig.json memecahkan masalah ini untuk saya.

terima kasih @andy-ms

Semua 47 komentar

Kami juga mendapatkan banyak kesalahan di sini. (Tidak dapat menemukan nama "Janji", Tidak dapat menemukan nama "Set", ...)
Mengembalikan ke 0.9.36 memecahkan masalah bagi kami saat ini.

@andy-ms / @mhegazy

"Definisi oleh" kata @rbuckton , tetapi tidak ada tanggapan di sana. Saya melihat bahwa komit terakhir dilakukan oleh Anda. Ada komentar?

Jika bukan @rbuckton yang bertanggung jawab, mungkin perbarui index.d.ts dengan benar bertanggung jawab?

Coba atur --lib di tsconfig Anda untuk mendapatkan definisi yang Anda butuhkan.

@andy-ms Saya tidak begitu akrab dengan kompiler TypeScript, itu internal dan bagaimana menggunakan perpustakaan jenis, jadi saya tidak yakin apa yang harus diatur di bagian lib di sini? Dan mengapa? Mohon saran.

@dozer75 lihat tautan ini: [opsi compiler TypeScript].(https://www.typescriptlang.org/docs/handbook/compiler-options.html)

Jika Anda memodifikasi file tsconfig.json, tambahkan properti lib dengan larik string yang menentukan pustaka mana yang akan disertakan. Bagi saya, saya menggunakan @types/core-js di lingkungan server node (dengan target es5, yaitu TypeScript saya sedang dikompilasi ke es5 untuk produksi) jadi saya baru saja menambahkan "es2015" dan semuanya bekerja dengan baik. Sepertinya jika Anda berada di lingkungan browser, menambahkan "dom" akan memberi Anda javascript standar window dan hal-hal seperti itu juga.

Dengan menambahkan

"lib": ["es2017", "dom"]

ke compilerOptions di tsconfig.json memecahkan masalah ini untuk saya.

terima kasih @andy-ms

@DrDanRyan dokumentasi
@Narven saat menambahkan es2017 ke lib Anda, Anda tidak perlu mengetik core-js lagi. Saya bertanya-tanya mengapa Anda tidak mendapatkan pengidentifikasi duplikat.

Saya agak bingung mengapa pengetikan core-js tiba-tiba bergantung pada kumpulan perpustakaan lain. Itu sepertinya bukan solusi yang tepat bagi saya.

@DaSchTour Saya pikir lib: ["dom", "es5", "scriptHost"] adalah default yang digunakan untuk target es5 jika Anda tidak menentukan sendiri properti lib . Setidaknya itulah pemahaman saya, dan itulah alasan mengapa Anda tidak mendapatkan pengidentifikasi duplikat ketika Anda menentukan sendiri lib: ["es2015", "dom"] .

Juga opsi lib adalah pengganti untuk menggunakan @types/core-js sebagai lawan dari ketergantungan.

@DrDanRyan itu jelas bukan pengganti! lib untuk ES2017 akan berisi lebih dari @types/core-js yang akan menyembunyikan kesalahan kompilasi saat menggunakan fitur yang tidak diisi oleh core-js

Itu sebabnya saya menggunakan "es2015" yang berfungsi untuk server simpul...

Masalahnya masih ada. lib berisi lebih dari core-js jadi menurut saya pengetikan untuk core.js tidak harus "diperpanjang" lib .

Saya pikir kita berbicara melewati satu sama lain di sini. Yang saya katakan adalah bahwa setelah memasukkan lib: ["es2015"] di tsconfig.json saya, saya tidak perlu menggunakan @types/core-js lagi jadi saya menghapusnya dan sekarang hanya menggunakan flag compiler.

Menautkan silang ini dengan PR yang menyebabkan: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/15108

Menempatkan lib: ["es2015"] tidak menyelesaikan masalah bagi saya.

saya masih mengerti

error TS2693: 'Promise' only refers to a type, but is being used as a value here.

Saya sudah mencoba menambahkan semuanya:

  "lib": [
    "es5",
    "es2015",
    "es2017",
    "dom",
    "scripthost"
  ],

dan masih mendapatkan kesalahan

Bisakah Anda memberikan kode yang gagal?

Saya akhirnya menyelesaikannya seperti ini:

{
  "compilerOptions": {
    "target": "es6",
    "module": "es6",
    ...
  },
  "lib": [
    "ES5",
    "ES2015",
    "DOM",
    "ScriptHost"
  ]

dan menghapus @types/core-js

@dmitriid tidak tahu mengapa, tetapi nilai lib yang sama bekerja untuk saya.

Ini seluruh tsconfig saya.

{
  "compilerOptions": {
    "target": "es5",
    "lib": [
      "es5",
      "es2015",
      "es2017",
      "dom",
      "scripthost"
    ],
    "module": "commonjs",
    "experimentalDecorators": true,
    "sourceMap": true
  }
}

Mungkin, saya telah memecahkan masalah saya dan mengambil kembali upvote saya dari posting asli.

Apakah menggunakan konfigurasi "lib" merupakan solusi jangka panjang yang tepat, atau akankah @types/cores-js diperbaiki sehingga dapat digunakan sama seperti sebelumnya?

@PrimalZed Saya tidak berpikir bahwa menggunakan lib adalah solusi yang tepat sama sekali, karena memperkenalkan fitur yang mungkin tidak tersedia melalui core-js. Jadi lib dan @types/core-js tidak akan pernah berisi kumpulan metode yang sama dan core-js akan selalu berisi kurang dari lib.

@DaSchTour mari kita lihat contohnya:

  • Ada perpustakaan X , yang menggunakan ES6 Map dan diketik menggunakan definisi lib es6
  • Untuk mendukung browser lama Anda telah mengimpor core-js polyfill dalam kode Anda sebelum mengimpor X .

Pustaka pihak ketiga tidak tahu apa-apa tentang implementasi polyfill yang sebenarnya sehingga polyfill harus memberikan definisi yang identik untuk menghindari bug seperti ini https://github.com/DefinitelyTyped/DefinitelyTyped/issues/15104

@just-boris dan kemudian ada proyek Y dan saat menggunakan core-js dan kompilasi ke es5 dengan es6 lib pengembang melihat bahwa string memiliki fungsi yang disebut normalisasi. Hebat mari kita gunakan, itulah yang saya cari. Dan beberapa minggu kemudian pengujian pada IE11 dan Safari 9 kami melihat kesalahan aneh yang kami harap dapat dihindari dengan menggunakan TypeScript
Oh dan tiba-tiba kita bisa menggunakan Proxy dengan ES5 di IE11. Bagus!
Jadi polyfill harus menerapkan dukungan penuh 100% untuk ES6 untuk menghindari bug dan memungkinkan penggunaan yang aman. 100%, 99,999% kurang karena lib akan mengungkapkan fitur yang tidak polyfill. Jadi mari kita ucapkan selamat tinggal core-js

Pada akhirnya, saya akhirnya memutakhirkan ke @types/ [email protected] dan memperbarui tsconfig saya ke ini sehingga menjaga kompatibilitas dengan IE 11.

"lib": [
      "dom",
      "dom.iterable",
      "es2015",
      "scripthost"
    ],

Dengan menambahkan

"lib": ["es2017", "dom"]

ke compilerOptions saya di tsconfig.json memecahkan masalah ini untuk saya.

terima kasih @Narven

@just-boris komentar Anda berhasil untuk saya, ty!

Saya perlu ini berfungsi untuk "target es5", menggunakan lib adalah peretasan dan hanya memiliki bau yang tidak enak secara keseluruhan.

Cara yang disarankan adalah menggunakan @types/core-js, yang sayangnya tidak berfungsi untuk kode sederhana seperti

let p = Promise.resolve( [ 1, 2, 3 ] );
p.then( function( v ) {
  console.log( v[ 2 ] ); // 1
} );

@andy-ms / @mhegazy
Jika boleh, saya ingin muncul kembali menulis di #15108:

Bukankah inti dari file definisi TypeScript untuk menjelaskan paket apa yang disediakan? Saya percaya definisi harus akurat untuk paket, bukan lingkungan. Khususnya dengan core-js, jika seseorang menggunakannya, misalnya, import 'core-js', mereka mungkin melakukannya karena mereka mengilapkan lingkungan mereka, bukan?

Alasan penting mengapa orang menggunakan definisi tipe adalah untuk memunculkan masalah pada waktu kompilasi, bukan pada saat runtime. Sebenarnya sangat penting bahwa definisi core-js mewakili apa yang core-js lakukan secara khusus karena tidak menyediakan polyfill yang sempurna untuk es2015/es2016/es2017. Karena alasan itu—khususnya untuk library seperti core-js —bahwa lib lingkungan harus menjadi masalah yang terpisah, yaitu, polyfill mungkin tidak sesuai dengan standar.

Menghasilkan perubahan yang melanggar di seluruh proyek karena perubahan seperti ini tidak dapat dianggap enteng seperti yang ditunjukkan di sini. Pertama, cukup sulit untuk melacak dampak memutakhirkan paket @types karena mereka tidak mengikuti semver (yang dengan sendirinya tidak apa-apa, terlepas dari konvensi non-standar yang digunakan oleh PastiTyped), tetapi itu bahkan lebih sulit jika mereka bahkan tidak benar-benar mencerminkan perpustakaan tempat Anda bekerja. Praktik-praktik ini sebagian meniadakan kekuatan, kegunaan, dan pada akhirnya pengalaman baik yang ingin diberikan oleh Typescript sendiri kepada pengembang.

Saya dapat memperbaiki kesalahan kompilasi saya dengan menambahkan yang berikut ini ke tsconfig.json .

    "target": "es5",
    "lib": ["es2015", "dom"]

Apa yang benar-benar bodoh tentang solusi ini, adalah tanpa menyertakan "dom", TypeScript akan error ketika Promise digunakan.

Anda juga mungkin mendapatkan kesalahan ini jika build Anda tidak disiapkan dengan benar.

Saya menggunakan gulp + gulp-typescript dan tidak mengatur proses pembuatan TypeScript untuk mempertimbangkan tsconfig.json.

Jadi coba ini:

gulp.task('typescript', function () {
  var tsProject = ts.createProject(`${sourceRoot}/tsconfig.json`);
  return gulp.src([`${sourceRoot}/**/*.ts`])
    .pipe(tsProject())
    .pipe(gulp.dest(`${destinationRoot}`));
});

Ini mungkin membantu dalam hubungannya dengan tanggapan lain oleh orang-orang :senyum:

Dengan menambahkan

"lib": ["es2015", "dom"]
ke compilerOptions saya di tsconfig.json memecahkan masalah ini untuk saya.

Seperti @elusive menambahkan properti "lib" ke tsconfig.json dengan nilai yang ditentukan memperbaiki masalah kompilasi.

Namun itu terlihat seperti peretasan.

Adakah solusi yang lebih bersih dalam perjalanan?

Saya mendapat kesan perubahan yang menyebabkan masalah ini tumpah komunitas pengembang. Satu bagian mengubah tsconfig.json mereka, bagian lain mengatur versi pengetikan ke rilis yang lebih lama.

@DaSchTour : dalam kasus saya, saya menggunakan trik untuk tsconfig.json karena itu hanya untuk contoh untuk Frint

Tetapi untuk proyek nyata, solusi nyata harus ditemukan. Tidak bisakah kami memperbarui dan memperbaiki core-js ?

Saya menggunakan semua yang terbaru dan tidak ada contoh lib berfungsi untuk saya :(

Saya melihat kesalahan ini juga. Itu tidak merusak segalanya tetapi itu mengganggu saya melihat garis-garis merah kecil itu pada kompilasi.

Mereka pergi dengan:

"target": "es5"
...
"lib": ["es5","dom","scripthost","es2015"]

Secara teknis kesalahan hilang hanya dengan "lib": ["es2015","dom"] , tetapi jika Anda melihat opsi kompiler TS , injeksi lib default untuk target es5 adalah "es5", "dom","scripthost" , dan saya tidak melakukannya' t ingin kehilangan default.

Namun, dengan perubahan ini saya melihat jeda/bug yang signifikan dalam respons program saya dibandingkan dengan sebelum saya menambahkan opsi lib , jadi saya menghapusnya. Solusi nyata untuk ini akan luar biasa!

Sekedar FYI, jika Anda melihat masalah ini saat mencoba membuat NG2 berfungsi, semua masalah ini hilang saat Anda menggunakan Angular CLI.

Ini adalah tsconfig yang dibuat Angular CLI:

"compileOnSave": false,
  "compilerOptions": {
    "outDir": "wwwroot/js/out-tsc",
    "baseUrl": "src",
    "sourceMap": true,
    "declaration": false,
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "target": "es5",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2016",
      "dom"
    ]
  }

Saya telah membiarkan ini terbuka untuk waktu yang lama sekarang, karena semua hal yang ditulis di sini menurut saya adalah solusi, bukan solusi.

Bukankah ini sesuatu yang akan diselesaikan dalam paket definisi itu sendiri?

Seperti keadaan lain, dengan menambahkan entri lib di tsconfig, ini berfungsi, tetapi juga membuat paket ini tidak diperlukan, mengapa kita membutuhkan paket ini sama sekali jika dapat ditangani hanya dengan mengatur lib (yang tetap harus kita lakukan)?

Solusi saya adalah menambahkan lib: [ "es2015", "dom" ] di ts.config saya dan saya juga menghapus perpustakaan ini karena tidak diperlukan ketika saya menambahkan entri lib.

Jika pemilik paket ini tidak ingin melakukan apa pun dengan ini. Saya menyarankan Anda untuk menutup masalah ini dengan komentar mengapa dan bagaimana melakukannya dengan benar sehingga semua orang tahu apa yang harus dilakukan.

Solusi ini berhasil untuk saya di mesin windows.

"lib": ["es2017", "dom"]
ke compilerOptions saya di tsconfig.json memecahkan masalah ini untuk saya.

terima kasih @andy-ms

@Jtreu Terima kasih atas tanggapan Anda terkait tegukan tentang topik ini.

Itulah masalah di awal proyek ini

https://github.com/toni-rmc/laravel-angular-integration

dan tanggapan Anda membantu menyelesaikannya.

Saya telah mengirimkan PR untuk mengembalikan ini ke formulir yang benar: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/19531

@dozer75 @ctlong @DaSchTour @rajinder-yadav @jackTheRipper

Jadi misalnya, Jika saya hanya menampilkan Simbol ES6 dengan core-js perpustakaan yang disertakan harus (setidaknya): es5 , dom , es2015.symbol

Adakah yang bisa mengkonfirmasi jika interpretasi saya benar? Terima kasih!
/cc @andy-ms

@cvsguimaraes Itu seharusnya benar.

ini masih rusak? Saya mendapatkan error TS2304: Cannot find name 'PropertyKey'. dan lebih banyak lagi di 0.9.43

UPDATE: Nevermind, saya tidak menyadari menyediakan file sumber untuk dikompilasi pada baris perintah seperti tsc priotractor.ts akan mencegahnya membaca `tsconfig. Saya membuat file tsconfig baru hanya untuk tes busur derajat saya yang hanya menyertakan satu file yang ingin saya kompilasi dan sekarang berfungsi dengan baik.

Ini konfigurasi saya jika itu membantu siapa pun

{
   "compileOnSave": false,
   "compilerOptions": {
      "baseUrl": ".",
      "moduleResolution": "node",
      "emitDecoratorMetadata": true,
      "experimentalDecorators": true,
      "target": "es5",
      "typeRoots": [
         "node_modules/@types"
      ],
      "lib": [
         "es2016",
         "dom"
      ]
   },
   "files": [
      "./config/protractor.config.ts"
   ]
}

Kalau-kalau orang lain bisa belajar dari kesalahan saya. Pastikan Anda mengedit tsconfig.json di direktori yang benar!

Setelah banyak membenturkan kepala, saya perhatikan bahwa saya sedang mengedit konfigurasi di root proyek saya alih-alih konfigurasi di root/src yang telah saya buka di VSCode. Setelah membuat perubahan yang direkomendasikan di sana itu berfungsi.

Memperbarui TypeScript ke v2.6.1 & mengaturnya sebagai versi untuk VS Code memecahkan masalah bagi saya.

@IAMtheIAM memperbaikinya untuk saya, terima kasih

Sedang mencoba sebagian besar pengaturan compilerOptions tercantum di sini dengan sedikit atau tidak berhasil selama beberapa hari. Sial, saya bahkan memutakhirkan paket TypeScript di OS saya!

Solusinya terlalu mudah untuk diperhatikan: jangan berikan file TS ke tsc secara langsung, tetapi tentukan dalam tsconfig.json dan panggil saja tsc .

@shybovycha Sebanyak itu memperbaiki masalah, dokumen menentukan Anda dapat dan harus dapat meneruskan file ke perintah secara langsung. Tanpa 'perbaikan' mini ini, saya masih akan mendapatkan kesalahan. Saya memiliki versi berikut:

    "@types/core-js": "2.5.0"
    "core-js": "2.5.7"
    "typescript": "3.1.6"
Apakah halaman ini membantu?
0 / 5 - 0 peringkat