Definitelytyped: @types/superagent error TS2304: Tidak dapat menemukan nama 'XMLHttpRequest'.

Dibuat pada 17 Okt 2016  ·  31Komentar  ·  Sumber: DefinitelyTyped/DefinitelyTyped

  • [ ] Saya mencoba menggunakan file xxxx/xxxx.d.ts terbaru di repo ini 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).
  • [ ] Saya ingin berbicara tentang xxxx/xxxx.d.ts .

    • Penulis definisi tipe itu adalah cc/ @....

Hari ini build saya mulai gagal karena kesalahan pada @type/superagent. Saya mulai menurunkan nomor versi sampai saya menemukan bahwa masalahnya dimulai dengan versi 2.0.34. Sebelum itu tidak ada kesalahan yang dihasilkan oleh kompiler TypeScript (menggunakan Versi 2.1.0-dev.20161017)

Dengan @types/ [email protected] kesalahannya adalah:
node_modules/@types/superagent/index.d.ts(79,12): kesalahan TS2304: Tidak dapat menemukan nama 'XMLHttpRequest'.

Dan dengan @types/ [email protected] kesalahannya adalah:
node_modules/@types/superagent/index.d.ts(79,12): kesalahan TS2304: Tidak dapat menemukan nama 'XMLHttpRequest'.

Saya harap info ini membantu kalian.

@types

Komentar yang paling membantu

Satu-satunya masalah yang saya miliki dengan menambahkan "dom" ke tsconfig.json saya adalah bahwa saya sedang menulis kode sisi server. Oleh karena itu tidak masuk akal bagi saya untuk menambahkan lib itu. XMLHttpRequest tidak dikirimkan dengan Node.js dan paket superagent tidak muncul dan error pada Node.js. Masalahnya adalah dengan paket @typings tidak menggunakan XMLHttpRequest secara kondisional menurut saya. Jika paket berfungsi dengan baik di Node.js dan browser, @typings juga akan berfungsi dengan baik.

Semua 31 komentar

Apakah Anda menggunakan opsi --lib dom untuk tsc?

Tidak. Dan saya tidak yakin apakah ini membantu tetapi pada kenyataannya ketergantungan langsung saya adalah supertest. Saya menggunakannya untuk pengujian unit kode sisi server.

@vvakame — Menambahkan "dom" ke array compilerOptions.lib saya di tsconfig.json berhasil. Ini tampaknya sedikit berlawanan dengan intuisi. Haruskah ini menjadi perilaku yang diharapkan atau ini hanya solusi sementara?

penafian: Saya bukan pengguna superagent.
Saya pikir itu adalah perilaku yang diharapkan.

https://www.npmjs.com/package/superagent

HTTP browser/node yang elegan & kaya fitur dengan API yang lancar

bekerja di sekitar.

interface XMLHttpRequest {}

Satu-satunya masalah yang saya miliki dengan menambahkan "dom" ke tsconfig.json saya adalah bahwa saya tidak memiliki bagian lib dalam file saya, dan sekarang setelah saya memilikinya, saya harus menyertakannya lib lain secara default seperti "es2016" .

Mungkin ada cara otomatis untuk memperbaikinya? yang tidak memerlukan modifikasi tsconfig.json ?

menambahkan ["dom", "es2017"] ke lib memperbaiki ini.

Satu-satunya masalah yang saya miliki dengan menambahkan "dom" ke tsconfig.json saya adalah bahwa saya sedang menulis kode sisi server. Oleh karena itu tidak masuk akal bagi saya untuk menambahkan lib itu. XMLHttpRequest tidak dikirimkan dengan Node.js dan paket superagent tidak muncul dan error pada Node.js. Masalahnya adalah dengan paket @typings tidak menggunakan XMLHttpRequest secara kondisional menurut saya. Jika paket berfungsi dengan baik di Node.js dan browser, @typings juga akan berfungsi dengan baik.

berlari ke ini hari ini juga. Jika kami tidak dapat memberikan/mengecualikan jenis tertentu secara kondisional, haruskah kami mempertimbangkan untuk menyediakan dua versi jenis ini untuk penggunaan node dan dom?

Anda dapat menambahkan file superagent.d.ts dengan konten berikut:

// error TS2304: Cannot find name 'XMLHttpRequest'
declare interface XMLHttpRequest {}
// error TS2304: Cannot find name 'Blob'
declare interface Blob {}

@vvakame itu benar-benar bukan 'perilaku yang diharapkan' untuk perpustakaan yang dirancang untuk penggunaan simpul atau DOM yang memerlukan pengetikan untuk keduanya di kedua lingkungan. Menggunakan perpustakaan ini mengharuskan orang untuk menambahkan pengetikan yang dapat dengan mudah menyebabkan bug, karena Anda tidak akan melihat peringatan kompiler saat mengakses global browser di node.js.

Kami telah digigit oleh ini di https://github.com/strongloop/loopback-next juga. Dengan menambahkan dom lib, namespace global tiba-tiba tercemar dengan tipe seperti Request yang tidak ada di Node.js

Kami menulis tumpukan server HTTP, jadi kami biasanya melakukan import {ServerRequest as Request} from 'http' . Namun, ketika baris ini dihilangkan secara tidak sengaja, atau ServerRequest tidak di-alias sebagai Request , maka TypeScript dengan senang hati mengkompilasi kode kita dan kesalahan hanya terlihat saat runtime. Dengan kata lain, TypeScript tidak lagi dapat menangkap kesalahan pada waktu kompilasi, yang mengalahkan tujuannya.

Saya baru saja memulai proyek baru, dan saya pikir saya akan pintar dan menyiasatinya dengan beralih dari supertest ke chai-http, tetapi chai-http menggunakan @types/supertest. -_-

Adakah pembaruan tentang ini atau apakah tidak akan ada perbaikan? Saya pikir @zephyrec yang terbaik, banyak orang menggunakan ini untuk sisi server (yaitu node).

Ada pembaruan tentang ini?

Solusi sederhana adalah dengan menggunakan konfigurasi TypeScript yang berbeda untuk menjalankan tes yang memperluas asli Anda dan mengubahnya. Jadi Anda membuat file tsconfig.test.json :

{
  "extends": "./tsconfig.prod.json",
  "compilerOptions": {
    "lib": ["dom", "..."] // supertest requires dom for type definitions to work
  }
}

(sebagai alternatif, Anda bisa mengatur flag compiler skipLibCheck:true alih-alih mengutak-atik lib dan itu akan melewati pemeriksaan tipe untuk semua node_modules )

Jika Anda menggunakan ts-jest Anda dapat memintanya untuk menggunakan konfigurasi Anda melalui

"jest": {
        "globals": {
            "ts-jest": {
                "tsConfig": "tsconfig.test.json"
            }
        }
}

Dengan cara ini Anda tidak mengorbankan keamanan jenis dalam kode reguler Anda, yang jelas tidak boleh dilakukan (saya akan menjatuhkan supertest dalam sekejap sebelum melakukan itu).

https://github.com/DefinitelyTyped/DefinitelyTyped/pull/33517 memperbaiki masalah ini tetapi PR dicegah dengan digabungkan oleh kesalahan

chai-http depends on superagent but has a lower required TypeScript version

Saya menafsirkan ini berarti bahwa @types/superagent tidak dapat memperbarui persyaratan TypeScript ke 3.0+ sampai semua paket @types yang bergantung pada @types/superagent juga telah memperbarui persyaratan TypeScript ke 3.0+. Bagi saya itu tampak seperti cacat dalam sistem @types karena itu mematok versi TypeScript saya ke versi TypeScript tertua dari semua hal yang bergantung pada saya.

Adakah orang di luar sana yang dapat mengonfirmasi pemahaman saya tentang pesan kesalahan itu dan jika demikian, apakah ada cara untuk mengatasinya?

Tidak adanya perbaikan permanen yang lebih baik seperti pada PR itu, saya menyelesaikan masalah dalam aplikasi saya dengan cara seperti ini:

/// <reference lib="dom" />
import request = require('supertest');

Arahan lib "triple-slash" itu akan berfungsi di TypeScript versi 3.0+.

Sudah hampir 2,5 tahun sejak masalah ini dibuka! Bagaimana kita bisa menyelesaikan ini.

FWIW, masalahnya hilang ketika Anda mengaktifkan opsi kompiler TypeScript skipLibCheck .

Ketika skipLibCheck diaktifkan, TypeScript tidak akan memeriksa file .d.ts - baik dari dependensi seperti @types/superagent tetapi juga file .d.ts yang mungkin Anda miliki di proyek Anda. Anda dapat menghapus dom dari lib Anda dan kompiler tidak akan mengeluh lagi.

Sebagai efek samping yang bagus, skipLibCheck biasanya juga meningkatkan kecepatan build secara signifikan.

@bajtos Itu dapat membuka kesalahan Anda, karena mengurangi keamanan tipe.

  • lib: [ "es6" ] berhasil
  • target: "es2016+" juga bekerja untuk saya

@G-Rath Kecuali saya salah paham, skipLibCheck tidak akan mengurangi keamanan jenis kode Anda, hanya file d.ts, yang sebagian besar kemungkinan merupakan bagian dari modul simpul dan bukan kode Anda.

Mengenai skipLibCheck, itu bukan solusi IMO yang layak. Dari https://stackoverflow.com/questions/52311779/usage-of-the-typescript-compiler-argument-skiplibcheck "bergantung pada apa kesalahannya, kompiler dapat memulihkannya dengan cara yang menyebabkan masalah di tempat lain dalam kode untuk tidak diperhatikan (misalnya, dengan mengganti jenis yang salah dengan apa pun), karenanya menekan kesalahan jenis (apakah dengan --skipLibCheck, //@ts-ignore, atau cara lain apa pun) adalah praktik yang berisiko"

@carnesen Anda bertaruh saya untuk itu - itu adalah pertanyaan stackoverflow yang tepat yang akan saya kutip :joy:

@rjmunro ini dia

Ini tidak seburuk // @ts-ignore , tetapi apa pun yang menekan kesalahan tipe, tidak peduli seberapa jarang, secara teknis melemahkan keamanan tipe kode Anda, terutama karena folder node_modules Anda terdiri dari .d.ts file yang digunakan TS untuk mengetik semuanya.

Saya pikir solusi terbersih sebenarnya adalah PR #33517 oleh @carnesen yang menambahkan perpustakaan dom sebagai referensi eksternal ke definisi tipe superagent , karena referensi ke Blob dan XMLHttpRequest diperlukan oleh definisi tipe superagent tetapi tidak oleh implementasinya, tergantung pada cara penggunaannya (_browser vs node_).

Satu-satunya downside nyata adalah bahwa referensi lib memerlukan TypeScript versi 3.0.0 yang telah dirilis kira-kira 9 bulan yang lalu sekarang.
Saya tidak yakin apakah ini hanya akan memengaruhi chai-http (lihat Travis-CI ) atau jika ada dependensi lain yang memerlukan versi TypeScript mereka untuk ditingkatkan ke 3.0.0

Ada pembaruan? Itu lagi 2 bulan kemudian ...

Setelah membaca semua ini, solusi terbersih yang tersedia saat ini adalah dari @carnesen tetapi tidak berfungsi untuk saya :-(

/// <reference lib="dom" />
import request = require('supertest');

Saya juga memeriksa PR-nya (https://github.com/DefinitelyTyped/DefinitelyTyped/pull/33517) tetapi kesalahan TravisCI tidak masuk akal karena chai-http tidak memerlukan versi TS lebih rendah dari 3.0...

Saya cukup baru di TypeScript, jadi jika saya melakukan kesalahan, beri tahu saya. Saya baru saja mengirimkan kode yang persis sama dengan yang dilakukan @carnesen dalam PR baru untuk menggali lebih dalam log Travis CI (https://github.com/DefinitelyTyped/DefinitelyTyped/pull/36282)

EDIT:

sepertinya chai-http bukan masalah lagi tapi promisify-supertest adalah... sepertinya paket terbengkalai yang tidak terlalu populer (https://github.com/ariporad/promisify-supertest/blob /master/test/index.js)

Bagaimana proses untuk memperbarui ini?

EDIT 2:

Saya menggali lebih dalam dan menemukan bahwa definisi tipe berikut perlu diperbarui:

  • menjanjikan-supertest
  • simpul-cw-sederhana
  • superagen-bunyan
  • superagen-tanpa-cache
  • superagen-awalan
  • supertest

// kesalahan TS2304: Tidak dapat menemukan nama 'XMLHttpRequest'
mendeklarasikan antarmuka XMLHttpRequest {}
// kesalahan TS2304: Tidak dapat menemukan nama 'Blob'
mendeklarasikan antarmuka Blob {}

@JasonKleban kemana file ini pergi? Dalam node_modules > superagent ? Saya sudah mencoba untuk mencari tahu ini dan saya kehabisan akal.

@mikeyamato - Saya tidak ingat di mana saya berhasil menggunakannya, tetapi tidak di node_modules karena Anda tidak mengelola file-file itu sendiri. Sebaliknya itu mungkin hanya di samping file sumber Anda yang lain. Anda akan mencobanya terlebih dahulu, saya berasumsi. Tidak ada perubahan?

Anda juga dapat bereksperimen dengan pengaturan folder pengetikan tsconfig.json?

EDIT: membuka masalah baru untuk melacak ini: #41425


Dengan bergabungnya #36282, muncul masalah baru. Saat menggunakan superagent dalam proyek node-only, pengenalan direktif triple-slash

/// <reference lib="dom" />

menghasilkan pengetikan DOM yang ditambahkan secara transparan ke proyek. Karena ini adalah proyek node-only, bagaimanapun, tidak ada DOM, dan kode seperti

window.setTimeout()

harus menghasilkan kesalahan TypeScript. Karena pengetikan DOM disertakan secara diam-diam, hal ini tidak terjadi, dan dapat menyebabkan bug halus dalam basis kode.

Apakah ada cara agar kita dapat memasukkan pengetikan node-only atau browser-only ke dalam sebuah proyek, sehingga kita dapat memilih mana yang akan digunakan?

Efek samping lain dari ketergantungan adalah dom adalah mencegah supertest ( superagent ) untuk digunakan dalam proyek dengan lib: webworker , ref: https: //github.com/microsoft/TypeScript/issues/20595. Sejauh yang saya lihat, ini belum pernah disebutkan sebelumnya.

$npm saya @types/ superagent@latest -D

Harus melakukan trik!

Apakah halaman ini membantu?
0 / 5 - 0 peringkat