انومها در فایل d.ts تایپاسکریپت
من تازه با Typescript آشنا هستم و آن را در یک پروژه create-react استفاده میکنم. یک پوشه به نام /typings دارم که فایل tsconfig.json من به آن اشاره میکند و تاکنون تمام اعلانهای نوع خود را در یک فایل index.d.ts در آن پوشه قرار دادهام.
تا حالا همه چیز خوب پیش رفته است. اعلانهای «type» و «interface» به نظر میرسد در تمام بخشهای پروژه من در دسترس هستند. من آنها را به صورت صریح از فایل index.d.ts صادر نمیکنم و آنها را به هیچ فایل دیگری وارد نمیکنم.
مشکل وقتی پیش میآید که من موارد زیر را اعلام کنم...
enum Gender {male, female}
وقتی سعی میکنم از enum در یک فایل دیگر استفاده کنم، خطا دریافت میکنم...
Ambient const enums are not allowed when the '--isolatedModules' flag is provided
من پاسخهای دیگری در SO خواندهام که میگویند باید enum را بهصورت const اعلام کنید اما این کمک نمیکند. همچنین پیشنهاد داده شده که باید «export default undefined» را در انتهای فایل بگذارید، اما وقتی این کار را میکنم، هیچ یک از نوعهای دیگر در بقیه پروژه در دسترس نیستند.
در نهایت، من سعی کردهام گزینههای کامپایلر خود را تغییر دهم تا "isolatedModules": false تنظیم شود، اما وقتی کامپایل میکنم بهطور خودکار دوباره به true برمیگردد. ظاهراً create-react-app همیشه این کار را انجام میدهد.
برای اینکه enum هایی که در فایل index.d.ts خود اعلام کردهام به طور خودکار در بقیه پروژه من قابل استفاده باشند، چه کاری باید انجام دهم؟
پاسخ شماره ۱
اینمها نمیتوانند وارد یک *.d.ts شوند.
دلیل این امر این است که enum ها دارای خروجی کامپایل شده هستند، در حالی که سایر .d.ts مانند رابط ها ندارند.
به عنوان مثال:
enum Hello{
One = 'This is one',
Two = ''
}
کامپایل میشود به:
"use strict";
var Hello;
(function (Hello) {
Hello["One"] = "This is one";
Hello["Two"] = "";
})(Hello || (Hello = {}));
در حالی که یک رابط:
interface Hello {
test: string;
}
کامپایل میشود به:
// an empty file, as interfaces are only used during pre-compile not in Javascript.
فایلهای .d.ts بهطور صریح در فایلها وارد نمیشوند و بنابراین، تایپاسکریپت نمیداند محتویات این فایل را کجا وارد کند. همانطور که احتمالاً میدانید، جاوااسکریپت از بالا به پایین کامپایل میشود، بنابراین جایی که آن enum در خروجی جاوااسکریپت وارد میشود حیاتی است.
تاریخچهای، ما شمارشهای خود را در یک فایل و کلاس common.ts قرار میدهیم که هر زمان نیاز به استفاده از یک شمارش داشته باشیم آن را وارد میکنیم.
