วิธีแก้ไขข้อผิดพลาด "ไม่พบไฟล์การประกาศสำหรับโมดูล" โดยใช้ไฟล์การประกาศของฉันเอง

Apr 17 2020

ฉันมีโครงการทดสอบที่ฉันกำลังทดสอบไฟล์คำจำกัดความประเภท โครงการมีไฟล์หนึ่งชื่อindex.tsซึ่งมีลักษณะดังนี้:

import i18nFu = require("gettext.js");

แพ็คเกจ gettext.jsถูกติดตั้งโดยใช้ Node.js ดังนี้:npm install gettext.js

รหัส VS แสดงข้อความแสดงข้อผิดพลาดต่อไปนี้สำหรับบรรทัดด้านบน:

ไม่พบไฟล์ประกาศสำหรับโมดูล 'gettext.js'

'SOME_PATH/gettext.js' มีประเภท 'ใดๆ' โดยปริยาย

ลอง 'npm install @types/gettext.js' หากมีอยู่ หรือเพิ่มไฟล์การประกาศใหม่ (.d.ts) ที่มี "declare module 'gettext.js';"

การติดตั้ง@types/gettext.jsโมดูลช่วยแก้ปัญหาได้ แต่ฉันสงสัยก็เลยไม่ได้หยุดอยู่แค่นั้น ฉันลบ@types/gettext.jsโมดูลอีกครั้งและพยายามสร้างไฟล์การประกาศด้วยตัวเอง

ฉันสร้างโฟลเดอร์ย่อยที่เรียกว่าtypes/gettext.jsในโฟลเดอร์ของโปรเจ็กต์และคัดลอกเนื้อหาของnode_modules/@types/gettext.jsโฟลเดอร์เก่าลงไป ฉันยังเพิ่มtypeRootsรายการในtsconfig.jsonไฟล์ของฉันเพื่อให้มีลักษณะดังนี้:

{
    "compilerOptions": {
        "lib": ["ES2017"],
        "module": "commonjs",
        "strict": true,
        "target": "es5",
        "typeRoots": ["./types", "./node_modules/@types"],
    },
    "files": ["test.ts"]
}

แต่ข้อความแสดงข้อผิดพลาดจะไม่หายไป การแทนที่เนื้อหาของtypes/gettext.js/index.d.tsไฟล์ ( ซึ่งคุณสามารถดูได้ที่นี่ ) ด้วยdeclare module 'gettext.js'(ตามที่ข้อความแสดงข้อผิดพลาดแนะนำ) จะเป็นการลบข้อผิดพลาด แต่นั่นไม่ใช่วิธีแก้ปัญหาสำหรับการมีประเภท ฉันพลาดอะไรไป

PS:ฉันไม่สนใจวิธีแก้ปัญหาการแฮ็ก เช่น การใช้ts-ignoreหรือตั้งค่าnoImplicitAnyเป็นfalse.

คำตอบ

1 KrisztiánBalla Apr 19 2020 at 16:27

ฉันแก้ไขปัญหาโดยการตั้งค่าbaseUrlตัวเลือกคอมไพเลอร์ ที่น่าสนใจตอนนี้ฉันไม่ต้องการtypeRootsตัวเลือกเลยเพื่อคอมไพล์และรันให้สำเร็จ นี่คือtsconfig.jsonไฟล์ใหม่:

{
    "compilerOptions": {
        "lib": ["ES2017"],
        "module": "commonjs",
        "strict": true,
        "target": "es5",
        "baseUrl": "./types"
    },
    "files": ["tests.ts"]
}

ฉันหวังว่านี่จะช่วยให้ใครบางคนประสบปัญหาเดียวกัน