TypeScript را یاد بگیرید – راهنمای جامع برای مبتدیان
TypeScript به یک استاندارد صنعتی برای ساخت برنامه های کاربردی در مقیاس بزرگ تبدیل شده است و بسیاری از سازمان ها آن را به عنوان زبان اصلی خود برای توسعه برنامه انتخاب می کنند.
این آموزش به عنوان راهنمای مقدماتی شما برای TypeScript خواهد بود. این برنامه برای پاسخگویی به فراگیران در تمام مراحل - از مبتدی تا کاربران پیشرفته طراحی شده است. مفاهیم اساسی و پیشرفته تایپ اسکریپت را آموزش می دهد و آن را به منبعی مفید برای هر کسی که به دنبال کشف تایپ اسکریپت است تبدیل می کند.
هدف این راهنما این نیست که یک منبع جامع باشد، بلکه یک مرجع مختصر و مفید است. این ماهیت TypeScript را به یک قالب قابل هضم تقطیر می کند.
چه یک تازه کار باشید که تازه شروع به کار کرده اید، چه یک یادگیرنده متوسط با هدف تثبیت دانش خود، یا یک کاربر پیشرفته که نیاز به تجدید سریع دارید، این راهنما برای برآورده کردن نیازهای یادگیری TypeScript شما ساخته شده است.
پس از مطالعه دقیق این آموزش و تمرین مثالهای موجود در آن، باید مهارت ساخت برنامههای TypeScript قوی، مقیاسپذیر و قابل نگهداری را داشته باشید. ما مفاهیم کلیدی TypeScript مانند انواع، توابع، کلاسها، رابطها، ژنریکها و موارد دیگر را پوشش خواهیم داد.
فهرست مطالب
TypeScript در مقابل جاوا اسکریپت
تایپ اعلان ها و متغیرها در TypeScript
پیش نیازها
قبل از شروع مطالعه این راهنما، باید درک اولیه ای از جاوا اسکریپت داشته باشید. آشنایی با مفاهیم برنامه نویسی شی گرا مانند کلاس ها، رابط ها و وراثت نیز توصیه می شود.
اما اگر با این مفاهیم تازه کار هستید، نگران نباشید - در این راهنما آنها را به تفصیل توضیح خواهیم داد.
این راهنما برای چه کسی است؟
این راهنما برای کسانی است که به دنبال یادگیری TypeScript هستند. چه مبتدی، چه یک زبان آموز متوسط یا یک کاربر پیشرفته باشید، این راهنما برای رفع نیازهای یادگیری TypeScript شما طراحی شده است.
همچنین یک مرجع مفید برای هر کسی است که به دنبال تقویت مهارت های TypeScript خود است.
تایپ اسکریپت در مقابل جاوا اسکریپت
TypeScript یک ابر مجموعه جاوا اسکریپت با تایپ ایستا است که برای ارتقای توسعه برنامه های کاربردی در مقیاس بزرگ طراحی شده است.
static typing
، classes
و interfaces
اختیاری را به JavaScript
معرفی میکند و با زبانهایی مانند C#
و Java
مشابهت میکند. کد TypeScript به جاوا اسکریپت ساده منتقل می شود و از سازگاری در محیط های مختلف جاوا اسکریپت اطمینان حاصل می کند.
در حالی که TypeScript و JavaScript می توانند در یک محیط کار کنند، تفاوت های کلیدی را نشان می دهند. نکته اصلی این است که تایپ اسکریپت به صورت ایستا تایپ می شود و ایمنی نوع را فراهم می کند، در حالی که جاوا اسکریپت به صورت پویا تایپ می شود.
بیایید به برخی از این تفاوت ها بپردازیم:
کد TypeScript در فایل های .ts
یا .tsx
نوشته می شود، در حالی که کد جاوا اسکریپت در فایل های .js
یا .jsx
قرار دارد. پسوندهای .tsx
و .jsx
نشان میدهند که فایل ممکن است حاوی دستور JSX باشد، که یک انتخاب محبوب برای توسعه UI در کتابخانههایی مانند React است.
بیایید تفاوت های بین JavaScript و TypeScript را از طریق یک مثال تحلیل کنیم:
// JavaScript function add(a, b) { return a + b; } // Calling the function add(1, 2); // Returns: 3
در مثال جاوا اسکریپت بالا، تابع add
دو پارامتر a
و b
را می گیرد و مجموع آنها را برمی گرداند. تابع با آرگومان های 1
و 2
فراخوانی می شود و 3
را به دست می دهد. توجه داشته باشید که پارامترهای تابع با انواع حاشیه نویسی نمی شوند، که در جاوا اسکریپت معمول است.
حال، بیایید ببینیم چگونه می توانیم همان تابع را در TypeScript بنویسیم:
// TypeScript function add(a: number, b: number): number { return a + b; } // Calling the function add(1, 2); // Returns: 3
در نسخه TypeScript، پارامترهای a
و b
را با نوع number
حاشیه نویسی کرده ایم. همچنین مشخص کردهایم که تابع یک number
را برمیگرداند.
این یک تفاوت کلیدی بین جاوا اسکریپت و تایپ اسکریپت است. TypeScript ایمنی نوع را اعمال می کند، به این معنی که انواع مقادیر را در زمان کامپایل تحلیل می کند و اگر با انواع مورد انتظار مطابقت نداشته باشد، خطاها را ایجاد می کند.
این ویژگی به شناسایی خطاها در مراحل اولیه توسعه کمک می کند و TypeScript را به یک انتخاب محبوب برای برنامه های کاربردی در مقیاس بزرگ تبدیل می کند.
TypeScript و JavaScript هر دو زبان های قدرتمندی هستند که در طیف وسیعی از برنامه ها استفاده می شوند. بیایید تفاوت های اصلی آنها را خلاصه کنیم:
ویژگی | TypeScript | جاوا اسکریپت |
---|---|---|
سیستم را تایپ کنید | تایپ استاتیک (انواع در زمان کامپایل تحلیل می شوند) | تایپ پویا (انواع در زمان اجرا تحلیل می شوند) |
سوپرست | بله، تایپ اسکریپت ابر مجموعه ای از جاوا اسکریپت است | N/A |
تالیف | نیاز به کامپایل (یا ترجمه) در جاوا اسکریپت است | نیازی به کامپایل ندارد |
ویژگی های OOP | شامل ویژگی های پیشرفته OOP مانند رابط ها، ژنریک ها و دکوراتورها است | از OOP از طریق نمونه های اولیه پشتیبانی می کند، به طور بومی از رابط ها یا ژنریک ها پشتیبانی نمی کند |
ابزار سازی | با تکمیل خودکار، تحلیل نوع و پشتیبانی از نقشه منبع، ابزارهای بهتری را ارائه می دهد | ابزار اولیه |
جامعه و اکوسیستم | جامعه و اکوسیستم جدیدتر و کوچکتر | جامعه بزرگ و اکوسیستم وسیع کتابخانه ها و چارچوب ها از سال 1995 |
منحنی یادگیری | تندتر به دلیل ویژگی های اضافی | به طور کلی برای مبتدیان راحت تر است |
موارد استفاده | معمولاً در پایگاههای کد بزرگتر استفاده میشود، جایی که مزایای تحلیل نوع و تکمیل خودکار بیشتر قابل توجه است. | مورد استفاده برای توسعه سمت کلاینت و سمت سرور، می تواند به صورت بومی در مرورگر اجرا شود |
مزایای TypeScript
TypeScript چندین مزیت نسبت به جاوا اسکریپت دارد:
ابزار بهبود یافته : تایپ استاتیک TypeScript پشتیبانی بهتر از ابزار را امکان پذیر می کند. ویژگی هایی مانند autocompletion
، inference
نوع، و تحلیل نوع، فرآیند توسعه را کارآمدتر و لذت بخش تر می کند.
مستندسازی بهتر : درک و نگهداری پایگاههای کد TypeScript اغلب آسانتر است. حاشیه نویسی های نوع به عنوان مستندات ضمنی عمل می کنند و درک نوع مقادیری را که یک تابع انتظار دارد و برمی گرداند آسان تر می کند.
آپشن های پیشرفته : TypeScript از آپشن های پیشرفته جاوا اسکریپت مانند decorators
و async/await
پشتیبانی میکند و همچنین آپشن های ی را که در جاوا اسکریپت موجود نیستند، مانند interfaces
، enums
و tuples
را معرفی میکند.
Refactoring : ابزار TypeScript باعث میشود که پایگاههای کد بزرگتر مجدداً ایمنتر و قابل پیشبینیتر شوند. می توانید با اطمینان تغییرات بزرگی ایجاد کنید.
پذیرش تدریجی : TypeScript ابر مجموعه ای از جاوا اسکریپت است، به این معنی که شما می توانید به تدریج TypeScript را در پروژه های خود استفاده کنید. میتوانید با تغییر نام فایلهای .js
خود به .ts
شروع کنید و سپس میتوانید بهتدریج یادداشتهای نوع را به دلخواه اضافه کنید.
جامعه و اکوسیستم : TypeScript جامعه و اکوسیستم رو به رشدی دارد. بسیاری از کتابخانه های محبوب جاوا اسکریپت، مانند React و Angular، دارای تعاریف TypeScript هستند که استفاده از آنها را در پروژه TypeScript آسان تر می کند.
تولید کد
کد TypeScript به طور بومی توسط مرورگرها یا Node.js قابل درک نیست، پس باید به جاوا اسکریپت منتقل شود. این فرآیند انتقال توسط کامپایلر TypeScript ( tsc
) انجام می شود که کد TypeScript را می خواند و کد جاوا اسکریپت معادل را تولید می کند.
برای ترانسپایل کردن یک فایل TypeScript، می توانید از دستور tsc
و به دنبال آن نام فایل استفاده کنید:
$ tsc index.ts
این دستور فایل index.ts
را به فایل index.js
در همان دایرکتوری تبدیل می کند. کد جاوا اسکریپت به دست آمده را می توان در هر محیط جاوا اسکریپت مانند مرورگر یا Node.js اجرا کرد.
تماشای تغییرات فایل
در طول توسعه فعال، مفید است که هر زمان که تغییراتی ایجاد می کنید، کد TypeScript شما به طور خودکار دوباره کامپایل شود. کامپایلر TypeScript یک گزینه --watch
را برای این منظور فراهم می کند:
$ tsc index.ts --watch
با این دستور، کامپایلر فایل index.ts
را زیر نظر گرفته و هر زمان که تغییری را تشخیص داد، به طور خودکار آن را کامپایل می کند.
پیکربندی کامپایلر TypeScript
برای پروژه های بزرگتر، داشتن یک فایل پیکربندی، tsconfig.json
، برای مدیریت گزینه های کامپایلر معمول است. این فایل به شما امکان می دهد فایل های سطح ریشه و گزینه های کامپایلر مورد نیاز برای کامپایل پروژه را مشخص کنید.
در اینجا نمونه ای از فایل tsconfig.json
آمده است:
{ "compilerOptions": { "target": "es5", "module": "commonjs", "strict": true, "outDir": "./dist" }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }
در این پیکربندی، شی compilerOptions
شامل گزینه هایی برای کامپایلر است. گزینه target
نسخه هدف ECMAScript را مشخص می کند، گزینه module
سیستم ماژول را تنظیم می کند، گزینه strict
طیف گسترده ای از رفتار تحلیل نوع را فعال می کند و گزینه outDir
فهرست خروجی فایل های جاوا اسکریپت کامپایل شده را مشخص می کند.
گزینه های include
و exclude
به ترتیب برای تعیین فایل هایی که باید کامپایل و نادیده گرفته شوند استفاده می شود.
برای کامپایل پروژه بر اساس فایل tsconfig.json
، می توانید دستور tsc
را بدون هیچ آرگومان اجرا کنید:
$ tsc
این دستور تمام فایل های TypeScript در پروژه را مطابق با گزینه های مشخص شده در فایل tsconfig.json
کامپایل می کند.
مبانی TypeScript
در این بخش، اصول اولیه TypeScript را تحلیل می کنیم. نمونه های بیشتری از نحوه تایپ استاتیک تایپ اسکریپت را مشاهده خواهید کرد و در مورد ابزار و تحلیل خطاهای آن بیشتر خواهید آموخت.
نصب و راه اندازی
قبل از اینکه وارد TypeScript شویم، باید مطمئن شوید که Node.js را روی سیستم خود نصب کرده اید. Node.js
یک محیط زمان اجرا است که به شما امکان می دهد جاوا اسکریپت را خارج از مرورگر اجرا کنید. می توانید Node.js را از وب سایت رسمی دانلود کنید.
پس از نصب Node.js، میتوانید TypeScript را با استفاده از Node Package Manager (npm) نصب کنید که همراه با Node.js ارائه میشود.
ترمینال خود را باز کنید و دستور زیر را اجرا کنید:
npm install -g typescript
این دستور TypeScript را به صورت سراسری بر روی سیستم شما نصب می کند. می توانید با اجرای دستور tsc
که مخفف compiler
TypeScript
است، نصب را تأیید کنید:
tsc --version
این دستور باید نسخه ای از TypeScript را که شما نصب کرده اید نمایش دهد.
اکنون که TypeScript نصب شده است، ما آماده هستیم تا سفر خود را به دنیای TypeScript آغاز کنیم!
پیکربندی
عالیه اکنون که TypeScript را نصب کرده ایم، بیایید در مورد چیز مهم دیگری صحبت کنیم: configuration
. برای پروژه های بزرگتر، داشتن یک فایل پیکربندی، tsconfig.json
، برای مدیریت گزینه های کامپایلر معمول است. این فایل به شما امکان می دهد فایل های سطح ریشه و گزینه های کامپایلر مورد نیاز برای کامپایل پروژه را مشخص کنید.
هنگامی که دستور tsc
اجرا می کنید، کامپایلر به دنبال یک فایل tsconfig.json
در دایرکتوری فعلی می گردد. اگر یکی را پیدا کرد، از گزینه های مشخص شده در فایل برای کامپایل پروژه استفاده می کند. اگر یکی را پیدا نکرد، از گزینه های پیش فرض استفاده می کند.
برای تولید فایل tsconfig.json
می توانید دستور زیر را اجرا کنید:
tsc --init
آشنایی با tsconfig.json
اکنون که تایپ اسکریپت را نصب و پیکربندی کرده ایم، بیایید به عمق فایل tsconfig.json
بپردازیم. این فایل بخش مهمی از هر پروژه TypeScript است. تنظیمات مختلفی را در خود نگه می دارد که تعیین می کند کد TypeScript شما چگونه در جاوا اسکریپت کامپایل می شود.
برای ایجاد یک فایل tsconfig.json
، می توانید از دستور tsc --init
همانطور که در بالا نشان دادم استفاده کنید. این دستور یک فایل tsconfig.json
در فهرست فعلی شما با برخی تنظیمات پیش فرض ایجاد می کند.
در اینجا مثالی از شکل ظاهری یک فایل tsconfig.json
آورده شده است:
{ "compilerOptions": { "target": "es5", "module": "commonjs", "strict": true, "outDir": "./dist" }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] }
در این پیکربندی:
شیء compilerOptions
حاوی تنظیماتی برای کامپایلر TypeScript است.
گزینه target
به کامپایلر می گوید که کد شما را در کدام نسخه ECMAScript کامپایل کند.
گزینه module
سیستم ماژول را برای پروژه شما تنظیم می کند.
گزینه strict
طیف گسترده ای از رفتار تحلیل نوع را فعال می کند.
گزینه outDir
دایرکتوری را مشخص می کند که فایل های جاوا اسکریپت کامپایل شده در آن قرار می گیرند.
گزینه های include
و exclude
به کامپایلر می گویند که کدام فایل ها را در طول فرآیند کامپایل شامل و حذف کند.
پس از راه اندازی فایل tsconfig.json
، می توانید پروژه TypeScript خود را به سادگی با اجرای دستور tsc
در ترمینال خود کامپایل کنید. این دستور تمام فایل های TypeScript را در پروژه شما با توجه به گزینه های مشخص شده در فایل tsconfig.json
کامپایل می کند.
تایپ اعلان ها و متغیرها در TypeScript
بیایید اکنون در مورد انواع بیشتر بدانیم. TypeScript از چندین نوع از جمله number
، string
، boolean
، object
، null
، undefined
، symbol
، bigint
و any
پشتیبانی می کند. بیایید هر یک از این انواع را با جزئیات تحلیل کنیم.
number
: این نوع برای مقادیر عددی استفاده می شود. می تواند یک عدد صحیح یا مقدار ممیز شناور باشد.
مثال:
let age: number = 30; let weight: number = 65.5;
string
: این نوع برای داده های متنی استفاده می شود. می توان آن را با استفاده از گیومه های تکی، نقل قول های دوتایی یا الفبای الگو تعریف کرد.
مثال:
let name: string = 'John Doe'; let greeting: string = `Hello, ${name}`;
boolean
: این نوع برای مقادیر منطقی استفاده می شود. فقط می تواند true
یا false
باشد.
مثال:
let isAdult: boolean = true; let isStudent: boolean = false;
object
: این نوع برای ساختارهای داده پیچیده استفاده می شود. یک شی می تواند دارای ویژگی ها و روش هایی باشد.
مثال:
let person: object = { name: 'John Doe', age: 30 }; let date: object = new Date();
null
: این نوع فقط یک مقدار دارد: null
. زمانی استفاده می شود که بخواهید به طور صریح یک متغیر را بدون مقدار یا شی تنظیم کنید.
مثال:
let emptyValue: null = null; let anotherEmptyValue: null = null;
undefined
: این نوع فقط یک مقدار دارد: undefined
. زمانی استفاده می شود که متغیری اعلام شده باشد اما هنوز مقداری به آن اختصاص داده نشده باشد.
مثال:
let unassignedValue: undefined = undefined; let anotherUnassignedValue: undefined;
مثال:
let symbol1: symbol = Symbol('symbol1'); let symbol2: symbol = Symbol('symbol2');
bigint
: این نوع برای اعداد کامل بزرگتر از 2^53 - 1
استفاده می شود که حد بالایی برای نوع number
است.
مثال:
let bigNumber: bigint = 9007199254740993n; let anotherBigNumber: bigint = BigInt(9007199254740993);
any
: این نوع زمانی استفاده می شود که نوع یک متغیر می تواند هر چیزی باشد. این راهی برای انصراف از تحلیل نوع است.
مثال:
let variable: any = 'I am a string'; variable = 42; // I am a number now
اکنون اجازه دهید در مورد روش های مختلفی که می توانید متغیرها را در TypeScript اعلام کنید صحبت کنیم.
TypeScript راهی برای تعریف شکل یک شی، از جمله ویژگی ها و روش های آن، با استفاده از اعلان های نوع ارائه می دهد. این به شما امکان می دهد انواع قابل استفاده مجدد ایجاد کنید که می توانند برای تعریف ساختار اشیاء در سراسر پایگاه کد خود استفاده شوند.
نوع مستعار : نام مستعار نوع راهی برای ایجاد یک نام جدید برای یک نوع موجود است. آنها اغلب برای تعریف انواع پیچیده که در مکان های متعدد استفاده می شوند استفاده می شوند.
مثال:
type Point = { x: number; y: number; } let origin: Point = { x: 0, y: 0 };
در این مثال، Point
یک نوع نام مستعار برای یک شی با ویژگی های x
و y
است. برای تعریف نوع شی origin
استفاده می شود.
انواع تقاطع : انواع تقاطع راهی برای ترکیب چندین نوع در یک نوع واحد است. آنها اغلب برای ایجاد انواع پیچیده که دارای خواص چندین نوع دیگر هستند استفاده می شوند.
مثال:
type Printable = { print: () => void; }; type Loggable = { log: () => void; }; type Logger = Printable & Loggable; let logger: Logger = { print: () => console.log('Printing...'), log: () => console.log('Logging...'), };
در این مثال Printable
و Loggable
دو نوع هستند که به ترتیب دارای روش print
و log
هستند. نوع Logger
تقاطع Printable
و Loggable
است، پس هم روش print
و هم log
دارد.
انواع اتحادیه : انواع اتحادیه راهی برای تعریف یک نوع است که می تواند یکی از چندین نوع مختلف باشد. آنها اغلب برای ایجاد انواع انعطاف پذیر که می توانند مقادیر مختلفی را نشان دهند استفاده می شوند.
مثال:
type ID = string | number; let id: ID = '123'; id = 123;
در این مثال، ID
یک نوع اتحاد است که می تواند یک string
یا یک number
باشد. از آن برای تعریف نوع متغیر id
استفاده می شود که می تواند یک string
یا یک number
به آن اختصاص داده شود.
Type Assertions : Type Assertions راهی است برای اینکه به کامپایلر TypeScript بگوییم که شما در مورد نوع یک مقدار بیشتر از آن می دانید. آنها شبیه به نوع ریخته گری در زبان های دیگر هستند.
مثال:
let value: any = 'Hello, TypeScript!'; let length: number = (value as string).length;
در این مثال، کلمه کلیدی as
برای بیان اینکه value
از نوع string
است استفاده می شود. این به ما امکان می دهد به ویژگی length
رشته دسترسی پیدا کنیم.
توابع در TypeScript
توابع بلوک های سازنده هر زبان برنامه نویسی هستند. آنها منطق را در واحدهای قابل استفاده مجدد از کد کپسوله می کنند و استفاده مجدد و مدولار بودن کد را ارتقا می دهند. در TypeScript، توابع را می توان با استفاده از کلمه کلیدی function
یا توابع پیکان ( =>
) تعریف کرد. هر دو روش موارد استفاده و ویژگی های خاص خود را دارند.
بیایید در مورد برخی از انواع توابع در TypeScript صحبت کنیم:
اعلان های تابع : توابع را می توان با استفاده از کلمه کلیدی function
و به دنبال آن یک نام تابع منحصر به فرد اعلام کرد. بدنه تابع در پرانتزهای مجعد {}
محصور شده است.
مثال:
function greet(name: string): void { console.log(`Hello, ${name}!`); } greet('Alice'); // Outputs: Hello, Alice!
در این مثال، greet
تابعی است که یک پارامتر، name
، از نوع string
را می گیرد. تابع هیچ چیزی را بر نمی گرداند، پس نوع بازگشت آن void
است.
توابع پیکان : توابع پیکان نحو مدرن تری برای نوشتن توابع در TypeScript و JavaScript هستند. آنها به ویژه هنگام نوشتن توابع کوچک و درون خطی مفید هستند.
مثال:
const greet = (name: string): void => { console.log(`Hello, ${name}!`); } greet('Bob'); // Outputs: Hello, Bob!
در این مثال، greet
یک تابع فلش است که دقیقاً مانند تابع greet
در مثال قبلی عمل می کند. نماد =>
پارامترهای تابع و بدنه تابع را از هم جدا می کند.
انواع توابع : در TypeScript می توانید نوع پارامترها و مقدار بازگشتی یک تابع را مشخص کنید. این امر ایمنی نوع را فراهم میکند و تضمین میکند که تابع با انواع آرگومانهای صحیح فراخوانی میشود و نوع صحیح مقدار را برمیگرداند.
مثال:
function add(a: number, b: number): number { return a + b; } let sum: number = add(1, 2); // sum is 3
در این مثال، تابع add
دو پارامتر a
و b
را می گیرد که هر دو از نوع number
هستند و یک number
برمی گرداند.
پارامترهای اختیاری و پیش فرض : TypeScript اجازه می دهد تا پارامترهای تابع اختیاری باشند یا مقادیر پیش فرض داشته باشند.
مثال:
function greet(name: string, greeting: string = 'Hello'): void { console.log(`${greeting}, ${name}!`); } greet('Charlie'); // Outputs: Hello, Charlie! greet('Charlie', 'Hi'); // Outputs: Hi, Charlie!
در این مثال، تابع greet
دارای دو پارامتر name
و greeting
است. پارامتر greeting
اختیاری است و مقدار پیشفرض «Hello» دارد.
Rest Parameters : TypeScript از پارامترهای استراحت پشتیبانی می کند که به شما امکان می دهد تعداد دلخواه آرگومان را به یک تابع ارسال کنید.
مثال:
function sum(...numbers: number[]): number { return numbers.reduce((a, b) => a + b, 0); } let total: number = sum(1, 2, 3, 4, 5); // total is 15
در این مثال، تابع sum
تعداد دلخواه آرگومان را می گیرد و مجموع آنها را برمی گرداند.
کلاس ها و اشیا در TypeScript
کلاس ها بخش اساسی برنامه نویسی شی گرا (OOP) هستند. آنها الگوهایی برای ایجاد اشیا، ارائه مقادیر اولیه برای حالت (متغیرهای عضو) و پیاده سازی رفتار (توابع یا روش های عضو) هستند.
TypeScript از کلاس هایی پشتیبانی می کند که با استفاده از کلمه کلیدی class
اعلام می شوند. یکی از مزیت های کلاس های TypeScript این است که از ویژگی های برنامه نویسی شی گرا (OOP) مانند inheritance
، encapsulation
و polymorphism
پشتیبانی می کنند.
اعلان کلاس : در TypeScript، کلاس ها با استفاده از کلمه کلیدی class
اعلان می شوند.
مثال:
class Person { name: string; age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } greet(): void { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); } } let john = new Person('John', 25); john.greet(); // Outputs: Hello, my name is John and I am 25 years old.
در این مثال، Person
یک کلاس با دو ویژگی name
و age
و یک متد greet
است. constructor
یک متد خاص برای ایجاد و مقداردهی اولیه یک شی ایجاد شده با یک کلاس است.
وراثت : TypeScript از وراثت پشتیبانی می کند، مکانیزمی برای پایه گذاری یک کلاس بر کلاس دیگر، با حفظ پیاده سازی مشابه. وراثت با استفاده از کلمه کلیدی extends
به دست می آید.
مثال:
class Employee extends Person { department: string; constructor(name: string, age: number, department: string) { super(name, age); this.department = department; } greet(): void { super.greet(); console.log(`I work in ${this.department}.`); } } let jane = new Employee('Jane', 30, 'HR'); jane.greet(); // Outputs: Hello, my name is Jane and I am 30 years old. I work in HR.
در این مثال، Employee
کلاسی است که Person
گسترش می دهد. یک department
اموال جدید اضافه می کند و روش greet
را لغو می کند. کلمه کلیدی super
برای فراخوانی متدهای مربوط به کلاس والد استفاده می شود.
کلاسهای انتزاعی : کلاسهای انتزاعی کلاسهایی هستند که نمیتوانند مستقیماً نمونهسازی شوند. آنها به عنوان کلاس های پایه برای کلاس های دیگر استفاده می شوند و می توانند حاوی متدهای انتزاعی باشند که باید توسط کلاس های مشتق شده پیاده سازی شوند.
مثال:
abstract class Shape { abstract area(): number; } class Circle extends Shape { radius: number; constructor(radius: number) { super(); this.radius = radius; } area(): number { return Math.PI * this.radius ** 2; } } let circle = new Circle(5); console.log(circle.area()); // Outputs: 78.54
در این مثال، Shape
یک کلاس انتزاعی با area
متد انتزاعی است. کلاس Circle
Shape
گسترش می دهد و متد area
را پیاده سازی می کند. کلاس های انتزاعی برای تعریف یک رابط مشترک برای مجموعه ای از کلاس ها مفید هستند.
کپسولهسازی : کپسولهسازی مجموعه دادهها (ویژگیها) و روشهایی است که بر روی دادهها (روشها) در یک واحد واحد به نام کلاس عمل میکنند. در TypeScript، کپسولهسازی با استفاده از اصلاحکنندههای دسترسی مانند عمومی، خصوصی و محافظت شده به دست میآید.
مثال:
class Person { private name: string; protected age: number; constructor(name: string, age: number) { this.name = name; this.age = age; } greet(): void { console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`); } } let john = new Person("John", 25); console.log(john.name); // Error: Property "name" is private console.log(john.age); // Error: Property "age" is protected
در این مثال، name
یک ویژگی خصوصی کلاس Person
است، پس از خارج از کلاس قابل دسترسی نیست. age
یک ویژگی محافظت شده است، پس می توان از زیر کلاس ها به آن دسترسی داشت اما از خارج از کلاس نمی توان به آن دسترسی داشت.
چند شکلی : چندشکلی توانایی یک جسم برای به خود گرفتن اشکال مختلف است. در TypeScript، چندشکلی از طریق overriding متد به دست میآید، که در آن یک متد در یک زیر کلاس دارای نام و امضای یکسان با متد در سوپرکلاس خود است.
مثال:
class Animal { speak(): void { console.log('Animal makes a sound'); } } class Dog extends Animal { speak(): void { console.log('Dog barks'); } } let animal: Animal = new Dog(); animal.speak(); // Outputs: Dog barks
در این مثال، Animal
یک کلاس پایه با متد speak
است. Dog
یک زیرمجموعه است که روش speak
را نادیده می گیرد. هنگامی که یک نمونه از Dog
به متغیری از نوع Animal
اختصاص داده می شود، متد speak
of Dog
فراخوانی می شود.
Access Modifiers : TypeScript از اصلاح کننده های دسترسی public
، private
و protected
پشتیبانی می کند. به طور پیش فرض، هر عضو public
است.
مثال:
class Animal { private name: string; constructor(name: string) { this.name = name; } public getName(): string { return this.name; } } let dog = new Animal('Dog'); console.log(dog.getName()); // Outputs: Dog
در این مثال، name
یکی از اعضای خصوصی کلاس Animal
است. فقط در کلاس Animal
قابل دسترسی است. متد getName
عمومی است، پس می توان آن را از خارج از کلاس فراخوانی کرد.
رابط ها در TypeScript
رابط ها در TypeScript روش های قدرتمندی برای تعریف قراردادها در کد شما هستند. آنها برای تحلیل تایپ کردن اینکه آیا یک شی با یک ساختار خاص مطابقت دارد یا خیر استفاده می شود.
با تعریف یک رابط، میتوانیم ترکیب خاصی از متغیرها را نامگذاری کنیم و مطمئن شویم که همیشه بهعنوان یک مجموعه استفاده میشوند.
اعلان رابط : رابط ها با کلمه کلیدی interface
اعلان می شوند.
مثال:
interface Person { name: string; age: number; } let john: Person = { name: 'John', age: 25 };
در این مثال، Person
یک رابط است که یک شی را توصیف می کند که name
string
و age
نوع number
دارد.
بیشتر بخوانید
مثال:
interface Person { name: string; age?: number; } let alice: Person = { name: 'Alice' };
در این مثال، age
یک ویژگی اختیاری در رابط Person
است. شیء alice
با وجود اینکه age
ندارد هنوز یک Person
است.
انواع توابع : رابط ها همچنین می توانند انواع توابع را توصیف کنند.
مثال:
interface GreetFunction { (name: string, age: number): string; } let greet: GreetFunction = function(name: string, age: number): string { return `Hello, my name is ${name} and I am ${age} years old.`; };
در این مثال، GreetFunction
رابطی است که تابعی را توصیف میکند که name
و age
میگیرد و یک string
برمیگرداند.
گسترش رابط ها : رابط ها می توانند یکدیگر را گسترش دهند و یک رابط جدید ایجاد کنند که اعضای رابط پایه را به ارث می برد.
مثال:
interface Animal { name: string; } interface Dog extends Animal { breed: string; } let myDog: Dog = { name: 'Rex', breed: 'German Shepherd' };
در این مثال، Dog
Animal
را گسترش می دهد، پس یک Dog
هم name
دارد و هم یک breed
.
Enums در TypeScript
Enums راهی برای تعریف مجموعه ای از ثابت های نامگذاری شده است. آنها اغلب برای نشان دادن مجموعه ای از مقادیر مرتبط، مانند روزهای هفته یا ماه های سال استفاده می شوند.
TypeScript از شماره های عددی و رشته ای پشتیبانی می کند و روشی انعطاف پذیر برای تعریف و کار با مجموعه ای از ثابت ها ارائه می دهد.
Enums عددی : عدد عددی راهی برای تعریف مجموعه ای از ثابت های نامگذاری شده با مقادیر عددی است. به طور پیش فرض، مقادیر ثابت ها از 0 شروع می شود و برای هر ثابت بعدی 1 افزایش می یابد.
مثال:
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } let today: Day = Day.Monday;
در این مثال، Day
یک عدد عددی است که نشان دهنده روزهای هفته است. به ثابت های Sunday
، Monday
، Tuesday
و غیره مقادیر عددی با شروع از 0 اختصاص داده می شود.
Enums رشتهها : رشتههای enum راهی برای تعریف مجموعهای از ثابتهای نامگذاری شده با مقادیر رشته هستند. برخلاف enum های عددی، مقادیر ثابت ها در enum رشته ای با مقدار نام ثابت مقدار دهی اولیه می شوند.
مثال:
enum Month { January = 'January', February = 'February', March = 'March', April = 'April', May = 'May', June = 'June', July = 'July', August = 'August', September = 'September', October = 'October', November = 'November', December = 'December' } let currentMonth: Month = Month.June;
در این مثال، Month
یک عدد رشته ای است که ماه های سال را نشان می دهد. به ثابت های January
، February
، March
و غیره مقادیر رشته ای برابر با نام آنها اختصاص داده می شود.
Enums محاسبه شده : Enum ها می توانند مقادیر محاسبه شده داشته باشند که به جای مقدار ثابت با یک عبارت مقداردهی اولیه می شوند. این به انعطاف پذیری بیشتری در تعریف مقادیر ثابت ها اجازه می دهد.
مثال:
enum Color { Red = 1, Green = Math.pow(2, 2), Blue = Math.pow(2, 3) } let color: Color = Color.Green;
در این مثال، Color
یک عدد با مقادیر محاسبه شده است. با استفاده از تابع Math.pow
به ثابت های Red
، Green
و Blue
به ترتیب مقادیر 1، 4 و 8 اختصاص داده می شود.
Reverse Mapping : Enum ها در TypeScript از نگاشت معکوس پشتیبانی می کنند، به این معنی که می توانید از مقدار آن به نام یک ثابت دسترسی پیدا کنید. این برای اهداف اشکال زدایی و ورود به سیستم مفید است.
مثال:
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday } let dayName: string = Day[1]; // 'Monday'
در این مثال، Day
enum برای دسترسی به نام استفاده می شود
ژنریک در TypeScript
Generics راهی برای تعریف یک تابع یا کلاس است که می تواند با انواع مختلف داده استفاده شود. آنها اغلب برای ایجاد اجزای قابل استفاده مجدد استفاده می شوند که می توانند با انواع مختلف داده ها کار کنند.
TypeScript از ژنریک ها پشتیبانی می کند و به شما این امکان را می دهد که کدهای ایمن بنویسید که انعطاف پذیر و قابل استفاده مجدد هستند.
اکنون به چند نمونه از توابع و کلاس های عمومی نگاه می کنیم.
توابع عمومی : توابع عمومی توابعی هستند که می توانند با انواع داده ها کار کنند. آنها با استفاده از پارامترهای نوع تعریف میشوند، که محلهایی برای انواع واقعی هستند که هنگام فراخوانی تابع استفاده میشوند.
مثال:
function identity<T>(value: T): T { return value; } let result1: number = identity<number>(42); let result2: string = identity<string>('Hello, TypeScript!');
در این مثال، identity
یک تابع عمومی است که یک پارامتر نوع T
را می گیرد و مقداری از نوع T
را برمی گرداند. پارامتر type T
برای تعیین نوع آرگومان و مقدار بازگشتی استفاده می شود.
کلاس های عمومی : کلاس های عمومی کلاس هایی هستند که می توانند با انواع داده ها کار کنند. آنها با استفاده از پارامترهای نوع تعریف میشوند، که مکانهایی برای انواع واقعی هستند که در زمان نمونهسازی کلاس استفاده میشوند.
مثال:
class Box<T> { value: T; constructor(value: T) { this.value = value; } } let box1: Box<number> = new Box<number>(42); let box2: Box<string> = new Box<string>('Hello, TypeScript!');
در این مثال، Box
یک کلاس عمومی است که یک پارامتر نوع T
را می گیرد و دارای value
خاصیت نوع T
است. پارامتر نوع T
برای تعیین نوع مقدار ذخیره شده در کادر استفاده می شود.
محدودیتهای عمومی : محدودیتهای عمومی راهی برای محدود کردن انواعی هستند که میتوانند با یک تابع یا کلاس عمومی استفاده شوند. آنها با استفاده از کلمه کلیدی extends
و به دنبال آن نوع یا رابطی که پارامتر type باید گسترش دهد، تعریف می شوند.
مثال:
interface Printable { print(): void; } function printValue<T extends Printable>(value: T): void { value.print(); } class Person implements Printable { print(): void { console.log('Printing person...'); } } let person: Person = new Person(); printValue(person);
در این مثال، Printable
یک رابط است که یک روش print
را تعریف می کند. تابع printValue
یک تابع عمومی است که یک پارامتر نوع T
را می گیرد که باید Printable
گسترش دهد. کلاس Person
رابط Printable
را پیاده سازی می کند.
در این مرحله شما یک درک اولیه از TypeScript دارید و می توانید شروع به غواصی در مفاهیم پیشرفته تر کنید.
نتیجه گیری
در این مقاله با اصول TypeScript آشنا شدید.
ما در مورد نحو اصلی TypeScript مانند متغیرها، توابع و کلاس ها صحبت کردیم.
شما همچنین با انواع داخلی TypeScript مانند اعداد، رشته ها و بولی ها آشنا شدید.
ما در مورد شمارشهای داخلی TypeScript، مانند شمارههای اعداد، شمارههای رشتهها و شمارههای محاسبهشده بحث کردیم. و شما در مورد انواع عمومی TypeScript، مانند توابع و کلاس های عمومی آشنا شدید.
با تشکر از شما برای خواندن!
ارسال نظر