Saya membaca cara kerja resolusi modul TypeScript .
Saya memiliki repositori berikut: @ ts-stack / di . Setelah mengkompilasi struktur direktori adalah sebagai berikut:
├── dist
│ ├── annotations.d.ts
│ ├── annotations.js
│ ├── index.d.ts
│ ├── index.js
│ ├── injector.d.ts
│ ├── injector.js
│ ├── profiler.d.ts
│ ├── profiler.js
│ ├── providers.d.ts
│ ├── providers.js
│ ├── util.d.ts
│ └── util.js
├── LICENSE
├── package.json
├── README.md
├── src
│ ├── annotations.ts
│ ├── index.ts
│ ├── injector.ts
│ ├── profiler.ts
│ ├── providers.ts
│ └── util.ts
└── tsconfig.json
Dalam package.json saya saya tulis "main": "dist/index.js"
.
Di Node.js semuanya berfungsi dengan baik, tetapi TypeScript:
import {Injector} from '@ts-stack/di';
Tidak dapat menemukan file deklarasi untuk modul '@ ts-stack / di'. '/path/to/node_modules/@ts-stack/di/dist/index.js' secara implisit memiliki tipe 'apa saja'.
Namun, jika saya mengimpor sebagai berikut, maka semuanya berfungsi:
import {Injector} from '/path/to/node_modules/@ts-stack/di/dist/index.js';
Apa yang saya lakukan salah?
typescript
node-modules
ktretyak
sumber
sumber
npm install @types/node --save-dev
require
bukanimport
sedikit anti-pola: lebih baik mendeklarasikan modul dalam.d.ts
file; lihat jawaban saya di bawah ini.const mdbreact = require('mdbreact'); const { Button, Card, CardBody, CardText, CardTitle, CardImage } = mdbreact;
Jika Anda mengimpor modul pihak ketiga
'foo'
yang tidak menyediakan pengetikan apa pun, baik di perpustakaan itu sendiri, atau dalam@types/foo
paket (dihasilkan dari repositori DefinitelyTyped ), maka Anda dapat membuat kesalahan ini hilang dengan mendeklarasikan modul dalam file dengan.d.ts
ekstensi. TypeScript mencari.d.ts
file di tempat yang sama yang akan mencari.ts
file normal : seperti ditentukan dalam "file", "termasuk", dan "kecualikan" ditsconfig.json
.Kemudian ketika Anda mengimpornya
foo
hanya akan diketik sebagaiany
.Sebagai alternatif, jika Anda ingin menggulung ketikan Anda sendiri, Anda juga dapat melakukannya:
Maka ini akan dikompilasi dengan benar:
Anda tidak harus memberikan pengetikan penuh untuk modul, cukup untuk bit yang sebenarnya Anda gunakan (dan ingin pengetikan yang tepat), jadi itu sangat mudah dilakukan jika Anda menggunakan API dalam jumlah yang cukup kecil.
Di sisi lain, jika Anda tidak peduli tentang pengetikan pustaka eksternal dan ingin semua pustaka tanpa pengetikan diimpor
any
, Anda dapat menambahkan ini ke file dengan.d.ts
ekstensi:Keuntungan (dan kerugian) dari ini adalah Anda dapat mengimpor apa saja dan TS akan dikompilasi.
sumber
d.ts
file? Anda harus memberikan konfigurasi seperti apatypeRoots
?.d.ts
file di tempat yang sama dengan mencari.ts
file normal : seperti yang ditentukan "file", "termasuk", dan "mengecualikan" ditsconfig.json
. Saya tidak akan merekomendasikan menggunakantypeRoots
untuk tujuan ini: itu dimaksudkan untuk lokasi modul tipe eksternal (yaitunode_modules/@types
), bukan.d.ts
file individual ..d.ts
file ini ?Jika Anda perlu perbaikan cepat, cukup tambahkan ini sebelum baris impor Anda:
sumber
error Do not use "// @ts-ignore" comments because they suppress compilation errors @typescript-eslint/ban-ts-ignore
Perasaan itu ketika Anda melihat keluar selama dua hari dan menemukannya seperti ini: cukup hapus
.js
dari"main": "dist/index.js"
dalampackage.json
dan semuanya bekerja dengan baik!UPD : jawaban ini relatif jika Anda memiliki paket npm Anda sendiri, jika tidak - lihat jawaban saya di bawah ini .
Dan jika jawaban di atas tidak diselesaikan impor modul Anda, coba tambahkan saja
typings
dipackage.json
:Tentu saja, di sini folder
dist
- ini tempat menyimpan file modul Anda.sumber
declare module "moduleName"
sementara ituTypeScript pada dasarnya menerapkan aturan dan menambahkan tipe ke kode Anda untuk membuatnya lebih jelas dan lebih akurat karena kurangnya kendala dalam Javascript. TypeScript mengharuskan Anda untuk menggambarkan data Anda, sehingga kompiler dapat memeriksa kode Anda dan menemukan kesalahan. Kompiler akan memberi tahu Anda jika Anda menggunakan tipe yang tidak cocok, jika Anda berada di luar jangkauan Anda atau Anda mencoba mengembalikan tipe yang berbeda. Jadi, ketika Anda menggunakan pustaka dan modul eksternal dengan TypeScript, mereka harus berisi file yang menjelaskan tipe dalam kode itu. File-file itu disebut jenis file pernyataan dengan ekstensi
d.ts
. Sebagian besar tipe deklarasi untuk modul npm sudah ditulis dan Anda dapat memasukkannya menggunakannpm install @types/module_name
(di mana module_name adalah nama modul yang jenisnya ingin Anda sertakan).Namun, ada modul yang tidak memiliki definisi tipenya dan untuk membuat kesalahan hilang dan mengimpor modul menggunakan
import * as module_name from 'module-name'
, buat foldertypings
di root proyek Anda, di dalam buat folder baru dengan nama modul Anda dan di dalamnya folder buatmodule_name.d.ts
file dan tulisdeclare module 'module_name'
. Setelah ini hanya pergi ke Andatsconfig.json
berkas dan menambahkan"typeRoots": [ "../../typings", "../../node_modules/@types"]
dalamcompilerOptions
(dengan path relatif tepat untuk folder Anda) untuk membiarkan naskah tahu di mana ia dapat menemukan jenis definisi perpustakaan dan modul dan menambahkan properti baru"exclude": ["../../node_modules", "../../typings"]
untuk file. Berikut ini adalah contoh tampilan file tsconfig.json Anda:Dengan melakukan ini, kesalahan akan hilang dan Anda akan dapat tetap berpegang pada aturan ES6 dan TypeScript terbaru.
sumber
index.d.ts
. Selain itu, ini adalah satu-satunya solusi yang bekerja untuk saya.Untuk orang lain yang membaca ini, coba ganti nama file .js Anda menjadi .ts
Sunting: Anda juga dapat menambahkan
"allowJs": true
ke file tsconfig Anda.sumber
Cara ini bekerja untuk saya:
1. tambahkan deklarasi Anda sendiri dalam file deklarasi seperti index.d.ts (mungkin di bawah root proyek) 2. tambahkan index.d.ts Anda ke tsconfig.json- edit: tanda kutip yang diperlukan di sekitar nama modul
sumber
Saya memiliki masalah yang sama menggunakan modul simpul dengan aplikasi reaksi yang ditulis dalam naskah. Modul berhasil diinstal menggunakan
npm i --save my-module
. Itu ditulis dalam javascript dan mengeksporClient
kelas.Dengan:
Kompilasi gagal dengan kesalahan:
@types/my-module
tidak ada, jadi saya menambahkanmy-module.d.ts
file di sebelah yangmy-module
diimpor, dengan baris yang disarankan. Saya kemudian mendapatkan kesalahan:Klien sebenarnya diekspor dan berfungsi normal jika saya menggunakannya di aplikasi js. Juga, pesan sebelumnya memberi tahu saya bahwa kompiler mencari di file yang tepat (
/node_modules/my-module/lib/index.js
didefinisikan dalammy-module/package.json
"main"
elemen).Saya memecahkan masalah dengan mengatakan kepada kompiler saya tidak peduli tentang implisit
any
, yaitu, saya mengatur kefalse
baris berikut daritsconfig.json
file:sumber
sederhana untuk memperbaiki Anda adalah:
jika Anda ingin mendeklarasikan antarmuka objek (Merekomendasikan untuk proyek besar) Anda dapat menggunakan:
Bagaimana cara menggunakannya? sederhana..
sumber
Saya mendapatkan ini juga, membuat saya bingung untuk sementara waktu, bahkan dengan modul dan tipe yang sudah diinstal dan memuat ulang IDE saya beberapa kali.
Apa yang diperbaiki dalam kasus saya adalah menghentikan proses terminal, menghapus
node_modules
, menghapus cache manajer paket node dan melakukan yang baruinstall
kemudian memuat ulang editor.sumber
Sayangnya itu di luar tangan kami apakah penulis paket mengganggu dengan file deklarasi. Apa yang cenderung saya lakukan adalah memiliki file
index.d.ts
yang berisi semua file deklarasi yang hilang dari berbagai paket:Index.ts:
sumber
Inilah yang berhasil membentuk saya.
npm install --save readline
sumber
Saya sudah mencoba semuanya di sini, tetapi bagi saya itu adalah masalah yang sama sekali berbeda: Saya harus menghapus dari
*.d.ts
semua pernyataan impor saya :Setelah menghapus kesalahan hilang ...
Klarifikasi : Ketika kami mendeklarasikan modul dalam
*.d.ts
file, itu secara otomatis diambil oleh kompiler Typecript sebagai modul ambient (yang Anda tidak perlu mengimpor secara eksplisit). Setelah kita tentukanimport ... from ...
, file sekarang menjadi modul normal (ES6), dan karenanya tidak akan diambil secara otomatis. Karenanya jika Anda tetap ingin berperilaku sebagai modul ambient , gunakan gaya impor yang berbeda seperti:sumber
Cukup Anda dapat mengimpornya menggunakan kode sebagai berikut:
sumber