Özel TypeScript tanım dosyası yazılırken "Modül 'adı" hatası, ... adresindeki türlenmemiş bir modüle dönüşüyor


90

@type/{name}Yüklü NodeJS paketlerimden biri için TypeScript tanımını bulamıyorum , bu yüzden bunun için bir d.tsdosya yazmaya ve dosyayı {project root}\typingsklasöre koymaya çalışıyorum . Ben böyle yaparım:

// 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;
}

Ancak, Visual Studio Code bu hatayı vermeye devam ediyor ve altına kırmızı çizgi koyuyor declare module 'node-helper-lib':

[ts] Büyütmede geçersiz modül adı. "Node-helper-lib" modülü, artırılamayan "{proje yolu} \ node_modules \ node-helper-lib \ index.js" konumunda türlenmemiş bir modüle çözümlenir.

Kitaplık tiplenmemiş olduğu için, ona yazı eklememe izin verilmesi yasal değil mi?

GÜNCELLEME:

Ben kullanıyorum:

  • TypeScript: 2.1.4
  • Visual Studio Kodu: 1.9.1
  • Düğüm JS: 6.9.4
  • Windows 10 x64

Yanıtlar:


153

Gerçek çözüm, @ paleo tarafından @ hirikarate'nin cevabındaki bir yorumda verilmiştir:

İthalat beyan edilmelidir modül beyanı.

Misal:

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

55

Bazı denemelerden ve hatalardan sonra, bunun augmentation"aynı dosyadaki bir modülü diğer modül bildirimleriyle birlikte bildirmek" anlamına geldiğini buldum .

Bu nedenle, türlenmemiş bir 3. taraf JavaScript kitaplığı için bir tanım dosyası yazmak istiyorsak declare module 'lib-name', bu dosyada YALNIZCA BİRİNE sahip olmalıyız ve 'lib-adı' kitaplık adıyla tam olarak eşleşmelidir (paket.json içinde bulunabilir, " adı "özellik).

Öte yandan, bir 3. taraf kitaplığın zaten .d.ts dahil edilmiş tanım dosyası varsa ve işlevlerini genişletmek istiyorsak, ek tanımı oluşturduğumuz başka bir dosyaya koyabiliriz. Buna denir augmenting.

Örneğin:

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

Birinin aynı sorusu olması durumunda keşfimi burada bırakıyorum. Ve bir şeyi kaçırdıysam lütfen beni düzeltin.


1
3. taraf bir kitaplıkta zaten .d.ts tanım dosyası varsa, ancak onu yok saymak ve özel bir tane kullanmak istiyorum.
Alen Liang

24
Tamamen türlenmemiş bir npm modülü için bir tanım dosyası yazmaya çalışıyorum, supertest- TypeScript'in şikayeti mantıklı bile değil, beyanı bile olmayan bir şeyi nasıl büyütemem? Birçok kez böyle özel tanım dosyaları yazdığımı sanıyordum ... [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.- ne yazık ki @types/supertestDOM kitaplıklarını dahil ederek bozuldu .. Şansım
kalmamış

35
@ChaseMoskal: Dosyanızda .d.ts, belki de tüm içe aktarımı "moduleName" beyan modülüne taşımalısınız {}.
Paleo

17
@ Paleo aynen buydu, tüm importaramalar declare module 'module' {}kapsam içine girmeli . hata en iyi
ihtimalle

2
TypeScript, importmodülünüzün gerektirdiği ifadeleri kendi declare moduleiçinde yerine dışına koyarsanız aynı şeyi yapar . Böyle beklenmedik garip davranışlar (burada bağırdığım için özür dilerim).
binki

0

Ben de o hata mesajını alıyordum. Benim için sorun, içinde bir modül bildirimi bulunan mevcut bir tür tanımlama dosyasında başka bir modül bildirmeye çalışmamdı. Yeni modül bildirimini yeni bir dosyaya taşıdıktan sonra, hata ortadan kalktı.


-4

Benim durumumda, tür dosyalarımdan birinde aşağıdaki bildirimi kullandım, böylece tüm tür olmayan tüm paketleri kullanabildim:

declare module '*'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.