มีข้อผิดพลาด "ชื่อโมดูล" จะแก้ไขเป็นโมดูลที่ไม่ได้พิมพ์ที่ ... "เมื่อเขียนไฟล์นิยาม TypeScript แบบกำหนดเอง


90

ฉันไม่พบคำจำกัดความ TypeScript @type/{name}สำหรับหนึ่งในแพ็คเกจ NodeJS ที่ฉันติดตั้งไว้ดังนั้นฉันจึงพยายามเขียนd.tsไฟล์และใส่ไฟล์ไว้ใน{project root}\typingsโฟลเดอร์ นี่คือวิธีที่ฉันทำ:

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

อย่างไรก็ตาม Visual Studio Code ยังคงให้ข้อผิดพลาดนี้และทำให้เส้นสีแดงอยู่ใต้declare module 'node-helper-lib':

[ts] ชื่อโมดูลไม่ถูกต้องในการเสริม โมดูล 'node-helper-lib' แก้ไขเป็นโมดูลที่ไม่ได้พิมพ์ที่ '{project path} \ node_modules \ node-helper-lib \ index.js' ซึ่งไม่สามารถเพิ่มได้

ไม่ถูกต้องหรือไม่เพราะไลบรารีไม่ได้พิมพ์ดังนั้นฉันจึงควรได้รับอนุญาตให้เพิ่มการพิมพ์ลงไป?

อัพเดท:

ฉันใช้:

  • TypeScript: 2.1.4
  • รหัส Visual Studio: 1.9.1
  • โหนด JS: 6.9.4
  • Windows 10 x64

คำตอบ:


153

วิธีแก้ปัญหาที่แท้จริงได้รับในความคิดเห็นโดย @Paleo ในคำตอบของ @ hirikarate:

ควรประกาศการนำเข้าภายในการประกาศโมดูล

ตัวอย่าง:

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

55

หลังจากลองและเกิดข้อผิดพลาดบางครั้งฉันพบว่านั่นaugmentationหมายถึง "การประกาศโมดูลในไฟล์เดียวกันพร้อมกับการประกาศโมดูลอื่น"

ดังนั้นหากเราต้องการที่จะเขียนไฟล์นิยามสำหรับuntypedห้องสมุด JavaScript ของบุคคลที่ 3 เราจะต้องมีเพียงหนึ่งdeclare module 'lib-name'ในแฟ้มที่และ 'lib ชื่อ' ต้องตรงกับชื่อไลบรารี (สามารถพบได้ใน package.json ของ " ชื่อ "คุณสมบัติ).

ในทางกลับกันหากไลบรารีของบุคคลที่สามมีไฟล์นิยาม .d.tsอยู่แล้วและเราต้องการขยายฟังก์ชันการทำงานเราสามารถใส่คำจำกัดความเพิ่มเติมในไฟล์อื่นที่เราสร้างขึ้นได้ นี้เรียกว่าaugmenting.

ตัวอย่างเช่น:

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

ฉันปล่อยให้การค้นพบของฉันไว้ที่นี่เผื่อว่ามีใครสงสัยเหมือนกัน และโปรดแก้ไขฉันหากฉันพลาดอะไรไป


1
ฉันควรทำอย่างไรหากไลบรารีของบุคคลที่สามมีไฟล์นิยาม. d.ts อยู่แล้ว แต่ฉันต้องการละเว้นและใช้ไลบรารีที่กำหนดเอง
Alen Liang

24
ฉันกำลังพยายามเขียนไฟล์คำจำกัดความสำหรับโมดูลsupertestnpm ที่ไม่ได้พิมพ์อย่างสมบูรณ์- การร้องเรียนของ TypeScript ไม่สมเหตุสมผลฉันจะไม่เพิ่มสิ่งที่ไม่มีการประกาศได้อย่างไร ฉันคิดว่าฉันได้เขียนไฟล์คำจำกัดความแบบกำหนดเองแบบนี้หลายครั้งแล้ว ... [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.- น่าเสียดายที่การ@types/supertestรวมไลบรารี DOM ทำให้มันเสีย .. ดูเหมือนว่าฉันจะโชคไม่ดี
ChaseMoskal

35
@ChaseMoskal: ในไฟล์ของคุณ.d.tsบางทีคุณควรย้ายการนำเข้าทั้งหมดไปไว้ในโมดูลการประกาศ "moduleName" {}
Paleo

17
@Paleo นั่นคือการimportโทรทั้งหมดต้องอยู่ในdeclare module 'module' {}ขอบเขต ข้อผิดพลาดทำให้เข้าใจผิดได้ดีที่สุด
pocesar

2
typescript จะทำสิ่งเดียวกันหากคุณใส่importคำสั่งที่โมดูลของคุณต้องการไว้ด้านนอกdeclare moduleแทนที่จะอยู่ข้างใน พฤติกรรมแปลก ๆ ที่ไม่ได้ตั้งใจ (ขออภัยสำหรับการพูดพร่ำเพ้อที่นี่)
binki

0

ฉันได้รับข้อความแสดงข้อผิดพลาดนั้นด้วย ปัญหาสำหรับฉันคือฉันพยายามประกาศโมดูลอื่นในไฟล์นิยามประเภทที่มีอยู่ซึ่งมีการประกาศโมดูลอยู่ในนั้น หลังจากที่ฉันย้ายการประกาศโมดูลใหม่ไปยังไฟล์ใหม่ข้อผิดพลาดก็หายไป


-4

ในกรณีของฉันฉันเพิ่งใช้การประกาศต่อไปนี้ในไฟล์ประเภทหนึ่งของฉันดังนั้นฉันจึงสามารถใช้แพ็คเกจที่ไม่ใช่ typescript ได้ทั้งหมด:

declare module '*'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.