وابستگیهای دایرهای در تایپاسکریپت
من در اعلام وابستگیهای چرخشی در تایپاسکریپت مشکل دارم. این هم کد:
//ویجت.ماژول.ts
/// <reference path="Buttons.ts" />
export module Widget {
class Widget {
}
}
//دکمهها.ts
/// <reference path="Widget.module.ts" />
class Button extends Widget{
function x(){
...
}
...
}
در این چیدمان، من میخواهم یک فایل اصلی داشته باشم که یک ماژول را تعریف کند و سپس تعدادی فایل وجود داشته باشند که از آن فایل اصلی به آنها ارجاع داده شود. این فایلها میتوانند شامل تعدادی کلاس باشند که یکدیگر را فراخوانی کنند، نمونهسازی کنند یا از یکدیگر ارثبری کنند.
در حال حاضر من این خطا را در خط حاوی «extends Widget» در فایل منبع Buttons.ts دریافت میکنم - چه اینکه آیا داخل یک ماژول صادر شده قرار دارد یا نه.
Could not file symbol widget
--بهروزرسانی--
دلیل اینکه میخواهم از تگهای مرجع به جای import/require استفاده کنم این است که میخواهم این فایلهای جداگانه تایپاسکریپت را با استفاده از گزینه --out در کامپایلر تایپاسکریپت به یک فایل جاوااسکریپت واحد تبدیل کنم.
پاسخ شماره ۱
من فرض میکنم که دو فایل شما در همان پوشه هستند؟
از کد فعلی، نمیتوانم بفهمم چرا میخواهید به Button.ts در فایل Widget.module.ts ارجاع دهید، اما این موضوع نکته اصلی نیست.
شما فایل Widget.module را شامل نمیکنید، فقط به آن ارجاع میدهید. ارجاع به فایلهای TypeScript تنها میتواند برای اعلام نوعها استفاده شود، نه برای پیادهسازیها.
کد خود را به این تغییر دهید:
import Widget = require("Widget.module");
class Button extends Widget.Widget {
x() {
// ...
}
// ...
}
توجه داشته باشید که شما باید به کلاس به صورت Widget.Widget ارجاع دهید زیرا شما ماژول را صادر میکنید، نه کلاس را. همچنین، در صورتی که در حال ساخت یک برنامه وب هستید، به یک بارگذار ماژول نیاز خواهید داشت تا ماژول ویجت را بارگذاری کند. در آن صورت، نگاهی به RequireJS بیندازید.
بهروزرسانی: مزیت استفاده از برچسبهای ارجاع این است که شما قادر هستید به انواع ارجاع دهید بدون اینکه نیاز به وارد کردن آنها داشته باشید. این میتواند مفید باشد
- در صورتی که بخواهید از یک کتابخانه جاوااسکریپت موجود در کد تایپاسکریپت خود استفاده کنید
- یا برای کد خودتان.
در حالت آخر، فرض کنید به عنوان مثال شما کد دیگری دارید که انتظار دارد یک متغیر از نوع Button باشد اما در واقع خود کلاس را نیاز ندارید.
class MyClassThatReferencesButtonButDoesNotActuallyNeedsTheImplementation {
myMethodThatExpectsAButton(someVar:Button) {
someVar.text = "My button!";
}
}
کلاس نیازی به پیادهسازی Button ندارد، فقط باید بداند چه ویژگیها و متدهایی روی آن موجود است. مزیت این موضوع زمانی واضحتر میشود که بفهمید در صورتی که Button وارد شده باشد به جای ارجاع دادن، نیاز است که توسط یک بارگذاریکننده ماژول جاوااسکریپت لود شود.
در حالت اول، فرض کنید کلاس Button شما نیاز به jQuery دارد. آیا میخواهید jQuery را همراه با کلاستان وارد کنید؟ یا فرض میکنید که این به صورت جهانی در دسترس است؟ در اصل، این همان موردی است که در بالا ذکر شد: شما نیازی به پیادهسازی TypeScript برای jQuery ندارید، فقط نیاز دارید بدانید چه ویژگیها و متدهایی در دسترس هستند، بنابراین شما فقط به یک فایل تعریف برای jQuery رجوع خواهید کرد.
فلگ --out فقط برای شامل کردن فایلهای ارجاع شده مفید است. در صورتی که ماژولهای imported داشته باشید، باید همه فایلها را کامپایل کنید و سپس از بهینهساز RequireJS برای ساخت خروجی خود به یک فایل استفاده کنید.
