javascript - ไฟล์ประกาศ Typescript สำหรับไฟล์ JS ภายในเครื่อง
ฉันกำลังพยายามเพิ่มการกำหนดประเภทสำหรับไฟล์ Javascript ของเราที่ทำงานในขณะที่เรากำลังอยู่ในกระบวนการแปลงเป็น Typescript อย่างไรก็ตาม ฉันไม่สามารถทำให้ไฟล์ประกาศถูกจดจำได้
นี่คือโครงสร้างไฟล์ของฉัน
เจเอส
- ฟู.เจส
การพิมพ์
ฟู
- index.d.ts
Fu.js
module.exports = function Foo() {
return 'Bar';
};
index.d.ts
export = Foo;
declare function Foo(): string;
index.ts
import Foo = require('./js/Foo')
console.log(Foo());
tsconfig.json
{
"compilerOptions": {
"typeRoots": ["./typings"],
"target": "es5",
"strict": true,
"baseUrl": "./",
"paths": {
"*": ["typings/*"]
}
}
}
package.json
{
"name": "fail",
"version": "1.0.0",
"description": "",
"main": "index.ts",
"scripts": {
"tsc": "tsc"
},
"author": "",
"license": "MIT",
"dependencies": {
"typescript": "^3.1.4"
}
}
นี่คือรีโปเพื่อทำซ้ำปัญหาของฉัน
https://github.com/erisman20/typings_help
แก้ไข: นี่คือข้อผิดพลาดที่ฉันได้รับ
error TS7016: Could not find a declaration file for module './js/Foo.js'. '....../js/Foo.js' implicitly has an 'any' type.คำตอบ #1
วิธีเดียวในการให้คำประกาศสำหรับการนำเข้าที่สัมพันธ์กันเช่น './js/Foo' คือการมีไฟล์ประกาศจริงที่เส้นทางนำเข้า (พร้อมกับ .d.ts หรือ /index.d.ts) หรือมีมันแบบเสมือนที่เส้นทางนำเข้าตามตัวเลือก rootDirs ของคุณ ไม่มี typeRoots หรือ baseUrl/paths มีบทบาทในสถานการณ์นี้: baseUrl/paths มีผลต่อการแก้ไขโมดูลเฉพาะเส้นทางที่ "ไม่สัมพันธ์กัน" และ typeRoots สามารถใช้เพื่อให้ TypeScript โหลดไฟล์ได้แต่ไม่ส่งผลต่อความสัมพันธ์ระหว่างเส้นทางนำเข้าและไฟล์เลย.
วิธีแก้ที่ง่ายที่สุดคือการวางไฟล์ Foo.d.ts ในไดเร็กทอรีเดียวกับ Foo.js หากคุณต้องการเก็บไทป์ในไดเร็กทอรีแยก คุณสามารถเพิ่ม "rootDirs": ["js", "typings"] ลงใน tsconfig.json การเปลี่ยนแปลงนี้เพียงพอที่จะทำให้ตัวอย่างของคุณทำงานได้สำหรับผม ถึงอย่างนั้นผมก็พบว่ามันสับสนที่จะมีไฟล์ Foo.js และ Foo/index.d.ts ที่ตรงกัน และขอแนะนำให้คุณใช้ความสอดคล้องในการใช้ไดเร็กทอรีย่อย กล่าวคือ ใช้ Foo/index.js บนฝั่ง JavaScript หรือเปลี่ยนไปใช้ Foo.d.ts บนฝั่ง TypeScript.