თავი 1 | შესავალი Angular-ში
რა არის TypeScript?
TypeScript არის JavaScript-ის გაუმჯობესებული ვერსია, დამატებითი ფუნქციონალით.
ის იყენებს იგივე სინტაქსს, რაც JavaScript, ანუ ნებისმიერი JavaScript-ის კოდი ვალიდარუი TypeScript-ია. თუმცა, აქ ასევე შემოღებულია სტატიკური ტიპები და უფრო მკაცრი წესები, რათა დეველოპერმა შეძლოს კოდში დაშვებული შეცდომის აღმოჩენა კომპილაციის დროს და არა კოდის გაშვებისას. ეს არის ერთ-ერთი მიზეზი, რის გამოც TypeScript გამოიყენება დიდი აპლიკაციების შემუშავებაში და სწორედ ამიტომაც Angular იყენებს მას.
TypeScript-თან მუშაობა
სტანდარტულად ბრაუზერს არ შეუძლია TypeScript-ის კოდის წაკითხვა, რის გამოც გვიწევს კოდის JavaScript-ზე გადაყვანა.
Online Playground
თუმცა, თუ არ გსურთ ფაილებთან მუშაობა და ტაიპსკრიპტის ქომფაილერის დაყენება, შეგიძლიათ გამოიყენოთ ონლაინ ქომფაილერი. საბედნიეროდ, ასეთი ბევრია.
აქ დაყენების გარეშე, პირდაპირ შეგვიძლია დავიწყოთ კოდის წერა.
ლოკალურად დაყენება
პირველ რიგში უნდა დავაყენოთ Node.Js ოფიციალური ვებ გვერდიდან.
ასევე დაგვჭირდება ნებისმიერი კოდის ედიტორი, მაგალითად: VS Code.
ტაიპსკრიპტის ქომფაილერის დაყენება
გავხსნათ კონსოლი და ავკრიფოთ:
MacOS-ზე ან ლინუქსე:
Node js გვჭირდებოდა npm ბრძანების გამოსაყენებლად.
შეგვიძლია install შევამოკლოთ და დავწეროთ მხოლოდ i.
-g-ს ვუთითებთ TypeScript-ის ქომფაილერის გლობალურად, ანუ მთლიან მოწყობილობაზე დასაყენებლად და არა კონკრეტულ დირექტორიაში.
დაყენების დასრულების შემდეგ აკრიფეთ
tcs ნიშნავს ტაიპსკრიპტის ქომფაილერის
-v ვერსიას.
ამის შემდეგ შექმენით ჯერ index.html ფაილი.
შემდეგ კი ტაიპსკრიპტის ფაილი და დავარქვით main.js.
როგორც ვახსენე, ტაიპსკრიპტი დაფუძნებულია ჯავასკრიპტზე, ამიტომ აქ შეგვიძლია ჩავწეროთ ჯავასკრიპტის კოდი.
რადგან ბრაუზერი ვერ ხედავს ტაიპსკრიპტის კოდს, გადავიდეთ ტერმინალში, დავრწმუნდეთ რომ სწორ საქაღალდეში ვდგავართ და ჩავწეროთ:
ანუ ჩვენ გვსურს გადავიყვანოთ main.ts ფაილი main.js-ად.
ყოველი ცვლილების შემდეგ თავიდან მოგვიწევს ამ ბრძანების აკრეფა, რაც კომფორტული არაა.
ამიტომ ამ ბრძანებას ბოლოს დავუმატოთ -w, რაც ნიშნავს watch-ს, ყურებას. ასე რომ ყოველი შენახვისას ავტომატურად გაიშვება ეს ბრძანდება და მოხდება ტაიპსკრიპტის კონვერტაცია.
საბოლოოდ HTML მივუთითოთ JS-ს ფაილი:
Basic Static Types
JavaScript არის Dynamically Typed - აქ ცვლადის ტიპი დინამიურია. ამიტომ ერთხელ გამოცხადებული სტრინგის ცვლადს შეგვიძლია მივანიჭოთ რიცხვითი მნიშვნელობა ან სხვა.
TypeScript კი არუს Statically Typed - თუ ჩვენ გამოვაცხადებთ რაიმე ცვლადს და ვიტყვით რომ ის სტრინგია, ვერ შევძლებთ მის სხვა ტიპზე შეცვლას.
Type Number
ტიპის მითითება შეგვიძლია ცვლადის სახელის მერე, :-ის გამოყენებით
სხვა სტატიკურ ენებისგან განსხვავებით ტაისპკრიპტში მთელი რიცხვები, ანუ int და ათწილადები: float ან double, ერთმანეთისგან არ არიან გამოყოფილნი, რადგან number მოიცავს ყველა მათგანს.
შესაბამისად:
თუ მივანიჭებთ რაიმე სტრინგის მნიშვნელობას, დავინახავთ შეცდომას.
Type String
ეს არის ისეთი ტიპი, რომელიც ინახავს ტექსტურ მნიშვნელობას.
Type Boolean
Explicit vs Implicit Type Declaration
თუ ვმუშაობთ მარტივ ტიპებთან და მომავალში არ ვაპირებთ მათი ტიპის შეცვლას, მაშინ შეგვიძლია გამოვტოვოთ ტიპის მითითება და ტაიპსკრიპტის კომპაილერი თვითონ გამოიცნობს ცვლადის ტიპი მისი, მნიშვნელობის მიხედვით.
თუ კურსორს გადავატარებთ age-ზე, ვნახავთ რომ მის ტიპი number-ია.
Type Any
თუ არ გვსურს ტიპებზე ფიქრი და გვინდა ისეთი ცვლადის შექმნა, რომელსაც მივანიჭებთ ნებისმიერ ტიპს, გამოიყენეთ any. Any ყველაფრის ნებას მოგვცემს. ასეთ ცვლადს ყველაფერი შეგვიძლია მივანიჭოთ. Any-ს მაშინ ვიყენებთ, როცა API-დან ველოდებით რაიმე respone-ს და არ ვიცით თუ რას დაგვიბრუნებს.
თუმცა, მისი გამოყენებით იკარგება ტაიპსკრიპტის გამოყენების აზრი, რადგან კომფაილერი ვერ შეძლებს შეცდომის აღმოჩენას. ამიტომ აერიდეთ მის გამოყენებას.
Type Unknown
თუ მაინც გვსურთ ყველა ტიპთან მუშაობა, უკეთესი იქნება თუ გამოვიყენებთ მეორე ტიპს რომელსაც ამატებს ტაიპსკრიპტი - Unknown. ის any-ს მსგავსია, თუმცა უფრო დაცული. თუ ცვლადს მივანიჭებთ ამ ტიპს, ნებისმიერ ქმედებაზე გვექნება შეცდომა. პირველ რიგში უნდა შევამოწმოთ თუ რა ტიპთან ვმუშაობთ. მაგალითად, თუ დარწმუნებულები ვართ რომ ჩვენი ცვლადი რიცხვია, მხოლოდ მაშინ შეგვძელება როცხვებთან დაკავშირებული ნებისმიერი ოპერაციის შესრულება, სტრინგთან სტრინგების და ასე შემდეგ. ასეთ მეთოდს ჰქვია type narrowing.
Array
მასივის შექმნა:
ან
ორივე სინტაქსი მიღებულია.
თუ ინიციალიზაციისას შევიტანთ მხოლოდ სტრინგებს, მაშინ ტაიპსკრიპტი ჩათვლის, რომ ამ მასივში მხოლოდ სტრინგები უნდა შევინახოთ და ფიქსირებულ ტიპს მისცემს.
Union
თუ ცვლადზე გვინდა რამდენიმე ტიპის მითითება, მაგალითად string-სა ან number-ის, any ან unknown-ის ნაცვლად უკეტესი იქნება თუ გამოვიყენებთ Union-ს, ამისთვის დავწეროთ ბიტური ოპერატორი 'ან' - |.
შეეცადეთ არ გადატვირთოთ ტიპებით.
ფუნქციები
ფუნქციის პარამეტრებს უნდა მივუთითოთ ტიპები:
ფუნქციის მნიშვნელობა შევინახოთ რაიმე ცვლადში.
რადგან ფუნქცია აბრუნებს რიცხვს, result-იც იქნება რიცხვი.
ზუსტად იგივე პრინციპით მუშაობს arrow function-იც.
თუ ფუნქცია არაფერს არ აბრუნებს, მაშინ return type-ად მიუთითეთ: void
ტიპების მიწერა კარგი პრაქტიკაა,
Optional Parameter
ეს ისეთი პარამეტრია, რომელიც შეგვიძლია არ მივაწოდოთ. ამისთვის გამოცხადებისას ტიპთან მივუთითოთ კითხვის ნიშანი.
Default Parameter
ის როგორც არასავალდებულო პარამეტრია, თუმცა ინახავს საწყის მნიშვნელობას, იმ შემთხვევაში, თუ ჩვენ არაფერს არ გადავცემთ.
Default და არასავალდებულო პარამეტრები აუცილებლად უნდა იყონ ბოლოში და არა ფუნქციის თავში.
OOP
კლასების შესწავლა ძალზედ მნიშვნელოვანია, რადგან ანგულარის კომპონენტის მოდელი სწორად ტაიპსკრიპტის კლასს წარმოადგენს.
კლასის შექმნის პროცესი იგივეა რაც ჯავასკრიპტში:
Access Modifiers
TypeScript-ში წვდომის მოდიფიკატორები აკონტროლებენ კლასის წევრების ხილვადობას. ისინი განსაზღვრავენ, თუ როგორ და სად შეიძლება წევრზე წვდომა თქვენი პროგრამის ფარგლებში.
TypeScript-ში სამი ძირითადი წვდომის მოდიფიკატორია:
public (Default)
private
protected
1. Public
წევრი, რომელიც მონიშნულია public-ად, ხელმისაწვდომია ნებისმიერი ადგილიდან, როგორც კლასის შიგნით, ასევე მის ფარგლებს გარეთ.
თუ წვდომის მოდიფიკატორი არ არის მითითებული, TypeScript მას public ხდის.
2. Private
წევრები, რომლებიც მონიშნულია როგორც private, ხელმისაწვდომი არიან მხოლოდ კლასში. მათ ვერ მივწვდებით კლასის გარედან.
ეს გვეხმარება მნიშვნელოვანი და სენსეტიური მონაცემების დასამალად.
3. Protected
Protected წევრები ხელმისაწვდომნი არიან კლასში და მის ქვეკლასში (შვილში).
თუმცა, როგორც private მიუწვდომელია კლასის გარედან.
Encapsulation
TypeScript-ში getter და setter არიან სპეციალური მეთოდები, რომლებიც განსაზღვრავენ, როგორ მოხდება კლასის თვისებების წამოღება და შეცვლა.
setter და getter ფუნქციები შეგვიძლია გამოვიძახოთ როგორც ჩვეულებრივი ცვლადები
Interface
TypeScript-ში ინტერფეისები არის მძლავრი ფუნქცია, რომელიც გამოიყენება ობიექტების ფორმის დასადგენად და კოდში ქმნის გარკვეულ სტრუქტურას. მასში შეგვიძლია მივუთითოთ თუ რა თვისებები და მეთოდები უნდა ჰქონდეს ობიექტს ან ობიექტს.
Generics
ჩვენ შეგვიძლია მოგვიწიოს რიცხვების, სტრინგების, ან ბულინის მასივის შექმნა. ამიტომ სტატიკურად ვერ მივუთითებთ ტიპს. ვერც გამოვიყენებთ any-ს, რადგან მაგალითად რიცხვებთან ერთად შეგვიძლია ბულინის დამატებაც, რაც შეცდომაა. Union ტიპებთანაც იგივე პრობლემა გვექნება და წინასწარ ვერ განვსაზღვრავთ ყველა საჭირო ტიპს.
მსგავსი გამოწვევების გადასაჭრელად შეიქმნა ჯენერიქები. ჯენერიკები ქმნიან ისეთ კომპონენტებს, რომლებსაც შეუძლიათ იმუშაონ ნებისმიერ ტიპთან, ამავდროულად ინარჩუნებენ ინფორმაციას გამოყენებული ტიპის შესახებ.
Generic Function
შეგვიძლია მივუთითოთ ნებისმიერი სახელი, რომელიც მიიღებს ტიპს, ხშირან პირველს აღნიშნავენ როგორც T-ს და მეორეს U-დ. ფუნქციის გამოძახებისას, ტაიპსკრიპტი გადაცემული მონაცემების მიხედვით შეეცდება გაარკვიოს ჯენერიქის ტიპი. თუმცა, უკეთესი იქნება თუ წინ ხელით მივუთითებთმ თუ რა ტიპებთან ვმუშაობთ, ზედმეტი პრობლემების ასარიდებლად.
შეგვიძლია გადავცეთ ერთ-ზე მეტი ჯენერიქი.
ის არა მარტო ფუნქციებთან გამოიყენება. ასებე ინტერფეისებთან და კლასებთანაც.
Generic Interface
Generic Class
Decorators
დეკორატორი არის სპეციალური ტიპის ფუნქცია, რომელიც გამოიყენება კლასებისა ან მათი წევრების (როგორიცაა მეთოდები, თვისებები ან აქსესუარები) თვისებების დეკლარაციული წესით შესაცვლელად ან გაფართოებისთვის.
საბედნიეროდ, დეკორატორის ხელით შექმნა იშვიათად გვიწევს. Angular-ში კი გვაქვს უკვე მზა, ჩაშენებული დეკორატორები, როგორებიცაა: @Component, @Input, @Output, @Injectabnle, @HostListener, @NgModule და სხვები, რომლებიც გვხემარებიან აპლიკაციის სტრუქტურისა და ქცევის განსაზღვრაში.