typescript - عنصر به طور ضمنی نوع 'any' دارد زیرا نوع 'Window' امضای اندیس ندارد؟
من در تلاش هستم یک کلاس کارخانه در تایپاسکریپت ایجاد کنم، اما با خطای زیر مواجه میشوم:
src/ts/classes/Factory.ts(8,10): خطا TS7017: عنصر بهصورت ضمنی نوع 'any' دارد زیرا نوع 'Window' امضای شاخص ندارد.
من سعی کردم این خطا را جستجو کنم، اما چیزی ندیدم که دقیقاً با کاری که میخواهم انجام دهم مطابقت داشته باشد.
کلاس کارخانه من به شرح زیر است.
/**
* @class Factory
*
* @description Returns object based on given class string
*/
class Factory {
public class(className: string): any {
return window[className];
}
}
من ترجیح میدهم فقط خطاهای ضمنی را در کامپایلر سرکوب نکنم.
هرگونه پیشنهاد یا کمکی بسیار مورد قدردانی قرار میگیرد! اگر این بهترین روش برای انجام این کار نباشد، قطعاً من آمادهام که آن را تغییر دهم.
پاسخ شماره ۱
راه دیگری برای ایندکسگذاری روی window، بدون نیاز به اضافه کردن یک اعلان، این است که آن را به نوع any تبدیل کنید:
return (window as any)[className];
پاسخ شماره ۲
متغیر سراسری window از نوع Window است. نوع Window هیچ امضای اندیسی ندارد، بنابراین تایپاسکریپت نمیتواند نوع window[yourIndex] را استنباط کند.
برای اینکه کد شما قبول شود، میتوانید این اینترفیس را به یک فایل غیرماژول اضافه کنید:
interface Window {
[key:string]: any; // Add index signature
}
توجه داشته باشید که این امکان دسترسی به هر ویژگی در window را فراهم میکند، به عنوان مثال window.getElmentById("foo") به دلیل اشتباه تایپی دیگر خطا نخواهد بود.
یادداشت جانبی: تکیه بر متغیرهای جهانی که به صورت سفارشی تغییر یافتهاند در درازمدت باعث مشکلات میشود، همچنین شما نمیخواهید فقط برای any از تایپهینت استفاده کنید. کل هدف تایپاسکریپت ارجاع به انواع خاص است. any در بهترین حالت نباید استفاده شود. شما نباید با فضای نام جهانی دستکاری کنید و همچنین توصیه میکنم به متغیر جهانی window تکیه نکنید.
