تاریخچه
تا پیش از نگارش 1.5 تایپ اسکریپت، مفاهیم internal modules و external modules وجود داشتند. جهت نامگذاری بهتر و کاهش سردرگمی در استفادهی آنها، از نگارش 1.5 به بعد، ماژولهای داخلی به namespaces (فضاهای نام) تغییر نام یافتند و ماژولهای خارجی به نام «ماژول» خلاصه شدند.
همچنین از نگارش 1.5 به بعد، پشتیبانی کاملی از نحوهی تعریف «ماژولها در ES 6» نیز به عمل میآید. بنابراین مطالعهی آن نیز پیشنهاد میگردد.
مفهوم ماژولها
هدف اصلی از ماژولها، ارائهی روشی برای مدیریت و ساماندهی پروژههای بزرگ با تعداد فایلهای زیاد است. در اینجا فایلهای ارجاعی، در زمان اجرا، توسط runtime جاوا اسکریپت بارگذاری شده و سپس به امکانات آنها دسترسی خواهیم داشت. ماژولها به صورت توکار در Node.JS نیز پشتیبانی میشوند؛ البته با فرمت common.js که کامپایلر TypeScript نیز قادر به تولید آن است.
امکان کامپایل به روشهای قدیمیتر تعریف ماژولها در TypeScript
در مورد انواع روشهای قدیمیتر نحوهی تعریف ماژولهای در جاوا اسکریپت مانند common.js، AMD و امثال آنها، مطالعهی مطلب «ماژولها در ES 6» توصیه میشود. فقط نکتهای که در اینجا حائز اهمیت است، این است که چون TypeScript قادر است به ES 5 نیز کامپایل شود و در ES 5 روش جدید ES 6 جهت تعریف ماژولها وجود ندارد، امکان تبدیل و ترجمهی کدهای TypeScript به تمام نوعهای معروف و شناخته شدهی ماژولها مانند common.js توسط کامپایلر TypeScript به صورت خودکار وجود دارد. برای این منظور از سوئیچ module کامپایلر استفاده میشود.
نحوهی تعریف ماژولها در TypeScript
برای تبدیل یک فایل ts به یک ماژول، تنها کافی است موردی را از آن export کنیم. آیتمهای موجود در یک ماژول، تنها زمانی در سایر فایلها قابل استفاده خواهند بود که از آن export شده باشند:
در این مثال، یک اینترفیس، کلاس و متد export شدهاند. برای این منظور واژهی کلیدی export به پیش از هر کدام از آیتمهای مدنظر اضافه شدهاست.
روش دیگر انجام این تعاریف، حذف واژهی کلیدی export از تمام موارد تعریف شده و سپس خلاصه کردن آنها در یک سطر، توسط روش export statement است؛ به نحو ذیل:
مزیت این روش، مشخص بودن محل تعاریف خروجیها است؛ بدون اینکه نیازی باشد تا تمام فایلرا جهت یافتن exportها جستجو کرد.
همچنین در اینجا میتوان نام دیگری را نیز برای خروجیها درنظر گرفت. برای مثال بجای نام GetMagazineByTitle، با استفاده از as syntax، یک نام جدید معرفی شدهاست.
نحوهی استفادهی از ماژولها در TypeScript
برای استفادهی از امکانات خروجی مثال قبل، در یک ماژول دیگر، به نحو ذیل عمل میکنیم:
در اینجا پس از تعریف واژهی کلیدی import، لیست موارد مدنظر از خروجیهای فایل periodicals را داخل یک {} میتوان قید کرد. بنابراین نیازی نیست تا تمام خروجیهای یک ماژول را import کرد. همچنین در اینجا نیز با استفاده از as syntax میتوان نام جدیدی را برای موارد import شده تعیین کرد.
در انتها نیز مسیر نسبی فایل ts ماژول، بدون ذکر پسوند آن، پس از واژهی کلیدی from ذکر میشود.
اگر نیاز است تمام خروجیهای یک ماژول به صورت خودکار import شوند، میتوان از * استفاده کرد:
اینبار با توجه به as syntax استفاده شده، نحوهی دسترسی به خروجیهای ماژول مدنظر به صورت ذیل خواهد بود (ابتدا ذکر نام alias تعریف شده، به همراه یک دات):
خروجی پیش فرض یک ماژول
اگر تنها قرار است یک آیتم از ماژولی export شود، میتوان از مفهوم default export استفاده کرد:
در این مثال export default بر روی یک کلاس بدون نام تعریف شدهاست. تعریف نام کلاس در اینجا اختیاری است و ماژول import کنندهی آن نیازی به دانستن این نام ندارد؛ زیرا در این حالت import کننده میتواند نام دلخواهی را به این خروجی پیش فرض بدهد؛ مانند AnimatedMovie بدون نیاز به ذکر {}:
تا پیش از نگارش 1.5 تایپ اسکریپت، مفاهیم internal modules و external modules وجود داشتند. جهت نامگذاری بهتر و کاهش سردرگمی در استفادهی آنها، از نگارش 1.5 به بعد، ماژولهای داخلی به namespaces (فضاهای نام) تغییر نام یافتند و ماژولهای خارجی به نام «ماژول» خلاصه شدند.
همچنین از نگارش 1.5 به بعد، پشتیبانی کاملی از نحوهی تعریف «ماژولها در ES 6» نیز به عمل میآید. بنابراین مطالعهی آن نیز پیشنهاد میگردد.
مفهوم ماژولها
هدف اصلی از ماژولها، ارائهی روشی برای مدیریت و ساماندهی پروژههای بزرگ با تعداد فایلهای زیاد است. در اینجا فایلهای ارجاعی، در زمان اجرا، توسط runtime جاوا اسکریپت بارگذاری شده و سپس به امکانات آنها دسترسی خواهیم داشت. ماژولها به صورت توکار در Node.JS نیز پشتیبانی میشوند؛ البته با فرمت common.js که کامپایلر TypeScript نیز قادر به تولید آن است.
امکان کامپایل به روشهای قدیمیتر تعریف ماژولها در TypeScript
در مورد انواع روشهای قدیمیتر نحوهی تعریف ماژولهای در جاوا اسکریپت مانند common.js، AMD و امثال آنها، مطالعهی مطلب «ماژولها در ES 6» توصیه میشود. فقط نکتهای که در اینجا حائز اهمیت است، این است که چون TypeScript قادر است به ES 5 نیز کامپایل شود و در ES 5 روش جدید ES 6 جهت تعریف ماژولها وجود ندارد، امکان تبدیل و ترجمهی کدهای TypeScript به تمام نوعهای معروف و شناخته شدهی ماژولها مانند common.js توسط کامپایلر TypeScript به صورت خودکار وجود دارد. برای این منظور از سوئیچ module کامپایلر استفاده میشود.
نحوهی تعریف ماژولها در TypeScript
برای تبدیل یک فایل ts به یک ماژول، تنها کافی است موردی را از آن export کنیم. آیتمهای موجود در یک ماژول، تنها زمانی در سایر فایلها قابل استفاده خواهند بود که از آن export شده باشند:
// periodicals.ts export interface Periodical { issueNumber: number; } export class Magazine implements Periodical { issueNumber: number; } export function GetMagazineByIssueNumber(issue: number): Magazine { // retrieve and return a magazine }
روش دیگر انجام این تعاریف، حذف واژهی کلیدی export از تمام موارد تعریف شده و سپس خلاصه کردن آنها در یک سطر، توسط روش export statement است؛ به نحو ذیل:
// periodicals.ts interface Periodical { issueNumber: number; } class Magazine implements Periodical { issueNumber: number; } function GetMagazineByTitle(title: string): Magazine { // retrieve and return a magazine } export { Periodical, Magazine, GetMagazineByTitle as GetMag}
همچنین در اینجا میتوان نام دیگری را نیز برای خروجیها درنظر گرفت. برای مثال بجای نام GetMagazineByTitle، با استفاده از as syntax، یک نام جدید معرفی شدهاست.
نحوهی استفادهی از ماژولها در TypeScript
برای استفادهی از امکانات خروجی مثال قبل، در یک ماژول دیگر، به نحو ذیل عمل میکنیم:
// news.ts import { Magazine, GetMag as GetMagazine} from './periodicals'; let newsMag: Magazine = GetMagazine('Weekly News');
در انتها نیز مسیر نسبی فایل ts ماژول، بدون ذکر پسوند آن، پس از واژهی کلیدی from ذکر میشود.
اگر نیاز است تمام خروجیهای یک ماژول به صورت خودکار import شوند، میتوان از * استفاده کرد:
// kids.ts import * as mag from './periodicals';
let kidMag: mag.Magazine= mag.GetMag('Games and Stuff!');
خروجی پیش فرض یک ماژول
اگر تنها قرار است یک آیتم از ماژولی export شود، میتوان از مفهوم default export استفاده کرد:
// movie.ts export default class{ title: string; director: string; }
// kids.ts import AnimatedMovie from './movie’; let cartoon = new AnimatedMovie();