انگولار - کامپایلر تایپاسکریپت نمیتواند فایل js وارد شده را نادیده بگیرد
من تازه تایپاسکریپت را با Angular2 شروع کردهام و با مشکل زیر مواجه شدهام. من با پروژه شروع سریع Angular2 شروع کردم و همه چیز خوب کار میکرد، تا وقتی که تلاش کردم یک فایل جاوااسکریپت ساده را وارد کنم. من از دستور import به صورت زیر استفاده میکنم
import * as myModule from './mymodule.js';
همچنین من allowJs: true را به فایل tsconfig.json اضافه کردم تا فایل جاوااسکریپت به عنوان یک واردات پذیرفته شود. خطای زیر توسط کامپایلر داده میشود:
خطا TS5055: نمیتوان فایل '.../mymodule.js' را نوشت زیرا این کار باعث بازنویسی فایل ورودی میشود.
تا جایی که من میفهمم، کامپایلر تایپاسکریپت نباید این فایل را کامپایل کند، چون قبلاً به جاوااسکریپت تبدیل شده، اما به دلایلی نمیتوانم آن را از کامپایل حذف کنم.
من سعی کردم فایل را به آرایه exclude: [] در tsconfig.json اضافه کنم، اما چون در یکی از فایلهای .ts من وارد شده است، این مورد لحاظ نمیشود (حداقل این چیزی است که من از مستندات TypeScript فهمیدم).
سؤال من این است که چگونه میتوانم پروژهام را با آن فایل گنجانده شده کامپایل کنم؟ آیا تنظیماتی وجود دارد که من از آن غافل شدهام؟ یا مشکلی در روش من وجود دارد؟
هرگونه کمک یا مشاوره قدردانی میشود زیرا این شروع به دیوانه کردن من میکند
اطلاعات اضافی
من از فایل tsconfig زیر استفاده میکنم:
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [ "es2015", "dom" ],
"noImplicitAny": true,
"suppressImplicitAnyIndexErrors": true
}
}
من در حال ساخت پروژهام هستم که اجرا میشود
npm run build
از کنسول. که یک اسکریپت در فایل package.json است که به این شکل به نظر میرسد:
"scripts": {
"build": "tsc -p src/",
...
بعد از اصلاحاتی که توسط @Seamus در زیر پیشنهاد شد، همان خطا رخ میدهد.
اما
اگر من فقط در کنسول اجرا کنم
tsc -p src/
خطایی که دریافت میکنم متفاوت است:
خطا TS7016: نمیتوان فایل اعلان برای ماژول 'mymodule' یافت
این شبیه این است که ماژول را پیدا میکند، اگر آن را بهصورت دستی انجام دهم، اما سؤال این است که چرا با npm run build کار نمیکند؟ آیا کار متفاوتی انجام میدهد؟
پاسخ شماره ۱
گزینه کامپایلر allowJs این کار را خواهد کرد:
اجازه دهید فایلهای جاوااسکریپت کامپایل شوند.
برای commonjs شما به یک اعلان ماژول مانند این نیاز خواهید داشت:
mymodule.d.ts
declare module "mymodule";
و در منبع خود جایی که وارد میکنید:
/// <reference path="mymodule.d.ts"/>
import * as myModule from 'mymodule';
به بخش «کار با کتابخانههای دیگر جاوااسکریپت» در مستندات مراجعه کنید.
پاسخ شماره ۲
باشه، میدانم این موضوع قدیمی است، اما من این مشکل را داشتم و فکر میکنم راهی برای حل آن پیدا کردهام (احتمالاً تا حدی بهخاطر یک بهروزرسانی Angular).
برای شروع:
- انگولار خود را به آخرین نسخه (
5.1) بهروزرسانی کنید. - TypeScript خود را به آخرین نسخه پشتیبانی شده ارتقا دهید (
4.*، در زمان نگارش -- نه5.*) - شما احتمالاً به
allowJs: trueدر فایل پیکربندی خود نیاز دارید.
دستورات ng serve --aot یا ng build --watch=auto --aot را اجرا کنید. شما باید خطای بالا را مشاهده کرده و نتوانید به سایت خود دسترسی پیدا کنید.
یکی از فایلهای .ts که بخشی از برنامه شما است را باز کنید و یک تغییر کوچک ایجاد کنید (مثل افزودن یک فاصله) و سپس فایل را ذخیره کنید.
برنامه شما باید کامپایل شود!
(به نظر من، فلگهای --watch=auto و --aot برای این راهحل موقت حیاتی هستند)
