Memiliki error "Module 'name' menyelesaikan ke modul yang tidak diketik di ..." saat menulis file definisi TypeScript kustom

90

Saya tidak dapat menemukan definisi TypeScript @type/{name}untuk salah satu paket NodeJS saya yang terinstal, jadi saya mencoba menulis d.tsfile untuknya, dan meletakkan file tersebut di {project root}\typingsfolder. Inilah cara saya melakukannya:

// My source code: index.ts
import Helper from 'node-helper-lib';


// My definition: \typings\node-helper-lib.d.ts
declare....(something else)

declare module 'node-helper-lib' {
   class Helper { ... }
   export = Helper;
}

Namun, kode Visual Studio terus menghasilkan kesalahan ini dan menempatkan garis merah di bawah declare module 'node-helper-lib':

[ts] Nama modul tidak valid dalam augmentasi. Modul 'node-helper-lib' menyelesaikan modul tanpa tipe di '{project path} \ node_modules \ node-helper-lib \ index.js', yang tidak dapat ditambah.

Bukankah sah karena perpustakaan tidak memiliki tipe, jadi saya harus diizinkan untuk menambahkan pengetikan ke dalamnya?

MEMPERBARUI:

Saya menggunakan:

  • TypeScript: 2.1.4
  • Kode Visual Studio: 1.9.1
  • Node JS: 6.9.4
  • Windows 10 x64
hirikarate
sumber

Jawaban:

153

Solusi sebenarnya diberikan dalam komentar oleh @Paleo dalam jawaban @ hirikarate:

Impor harus dideklarasikan di dalam deklarasi modul.

Contoh:

declare module 'node-helper-lib' {
   import * as SomeThirdParty from 'node-helper-lib';
   interface Helper {
       new(opt: SomeThirdParty.Options): SomeThirdParty.Type
   }
   export = Helper;
}
Lee Benson
sumber
55

Setelah beberapa kali mencoba dan error, saya menemukan itu augmentationberarti "mendeklarasikan modul dalam file yang sama dengan deklarasi modul lainnya".

Oleh karena itu, jika kita ingin menulis file definisi untuk pustaka JavaScript pihak ketiga yang tidak berjenis , kita harus memiliki HANYA SATU declare module 'lib-name'di file itu, dan 'lib-name' harus sama persis dengan nama pustaka (dapat ditemukan di package.json-nya, " nama "properti).

Di sisi lain, jika pustaka pihak ke-3 sudah memiliki file definisi .d.ts , dan kami ingin memperluas fungsinya, maka kami dapat meletakkan definisi tambahan di file lain yang kami buat. Ini disebut augmenting.

Sebagai contoh:

// These module declarations are in same file, given that each of them already has their own definition file.
declare module 'events' {
   // Extended functionality
}

declare module 'querystring' {
   // Extended functionality        
}

declare module '...' { ... }

Saya meninggalkan penemuan saya di sini kalau-kalau ada orang yang memiliki pertanyaan yang sama. Dan tolong perbaiki saya jika saya melewatkan sesuatu.

hirikarate
sumber
1
Apa yang harus saya lakukan jika pustaka pihak ketiga sudah memiliki file definisi .d.ts, tetapi saya ingin mengabaikannya dan menggunakan yang khusus?
Alen Liang
24
Saya mencoba menulis file definisi untuk modul npm yang benar-benar tidak diketik, supertest- Keluhan TypeScript bahkan tidak masuk akal, bagaimana saya tidak menambahkan sesuatu yang bahkan tidak memiliki deklarasi? Saya pikir saya telah menulis file definisi khusus seperti ini berkali-kali ... [ts] Invalid module name in augmentation. Module 'supertest' resolves to an untyped module at '/home/chase/Desktop/projects/formuoli/node_modules/supertest/index.js', which cannot be augmented.- sayangnya @types/supertestrusak dengan menyertakan pustaka DOM yang membuatnya rusak .. sepertinya saya kurang beruntung
ChaseMoskal
35
@ChaseMoskal: Dalam file Anda .d.ts, mungkin Anda harus memindahkan semua impor ke dalam modul deklarasi "moduleName" {}.
Paleo
17
@Paleo persis seperti itu, semua importpanggilan harus masuk ke dalam declare module 'module' {}scope. kesalahan itu menyesatkan paling-paling
pocesar
2
skrip jenis melakukan hal yang sama jika Anda meletakkan importpernyataan yang diperlukan oleh modul Anda di luar declare modulebukan di dalamnya. Perilaku aneh yang tidak intuitif (maaf telah mengomel di sini).
binki
0

Saya mendapatkan pesan kesalahan itu juga. Masalah bagi saya adalah bahwa saya mencoba mendeklarasikan modul lain dalam file definisi tipe yang sudah ada yang memiliki deklarasi modul di dalamnya. Setelah saya memindahkan deklarasi modul baru ke file baru, kesalahannya hilang.

G-Wiz
sumber
-4

Dalam kasus saya, saya hanya menggunakan deklarasi berikut di salah satu file tipe saya sehingga saya dapat menggunakan semua paket non-skrip:

declare module '*'
Alexey
sumber