1-bo‘lim
TypeScript nima?
TypeScript qanday muammoni hal qiladi, u qanday paydo bo'lgan va turlar ishga tushirish paytida nima bo'ladi.
Ushbu bo‘lim mundarijasi
JavaScript sizga ishonadi. Siz sonni kutgan joyga matn bersangiz, u e'tiroz bildirmaydi - shunchaki ishlayveradi va natija kutilmagan bo'lib chiqadi.
TypeScript aynan shu ishonchni tekshirib beradi.
Muammo #
Dokon uchun chegirma hisoblaydigan oddiy funksiya:
function chegirma(narx, foiz) {
return narx - narx * foiz / 100;
}
console.log(chegirma(10000, 20));
console.log(chegirma("10000", 20));
console.log(chegirma(10000));
Uchala chaqiruv ham ishlaydi. Natijaga qarang:
node narx.js
8000
8000
NaN
Ikkinchi qator tasodifan to'g'ri chiqdi - JavaScript "10000"
matnini songa aylantirdi. Uchinchisi esa NaN berdi, chunki
foiz berilmagan.
Hech qanday xato yo'q. Dastur ishladi va noto'g'ri natijani bemalol qaytardi.
Eng yaxshi holatda - testda. O'rtacha holatda - hamkasbingiz kod ko'rigida payqaydi.
Eng yomon holatda esa mijoz payqaydi: hisobda NaN so'm deb
yozilgan bo'ladi.
Xato qanchalik kech topilsa, tuzatish shuncha qimmat.
Yechim #
Xuddi shu kodni TypeScript da yozamiz - farq faqat ikki joyda qo'shilgan turlarda:
function chegirma(narx: number, foiz: number): number {
return narx - narx * foiz / 100;
}
console.log(chegirma(10000, 20));
console.log(chegirma("10000", 20));
console.log(chegirma(10000));
Endi kompilyatorga ko'rsatamiz:
tsc narx.ts --noEmit 2>&1 | fold -sw 74
narx.ts(6,22): error TS2345: Argument of type 'string' is not assignable
to parameter of type 'number'.
narx.ts(7,13): error TS2554: Expected 2 arguments, but got 1.
Ikkala xato ham topildi - va dastur umuman ishga tushmadi.
E'tibor bering, xabar juda aniq: qaysi fayl, qaysi qator, qaysi ustun, qanday xato kodi va nima kutilgan edi.
| Qism | Ma'nosi |
|---|---|
narx.ts(6,22) | Fayl, 6-qator, 22-ustun |
error TS2345 | Xato kodi - internetdan qidirish mumkin |
Argument of type 'string'... | Nima noto'g'ri ekanining tavsifi |
--noEmit - "faqat tekshir, JavaScript fayl yaratma" degani.
Chiqish kodi #
Bu CI uchun muhim:
tsc narx.ts --noEmit > xato.txt 2>&1
echo "kod: $?"
fold -sw 74 xato.txt
kod: 2
narx.ts(6,22): error TS2345: Argument of type 'string' is not assignable
to parameter of type 'number'.
narx.ts(7,13): error TS2554: Expected 2 arguments, but got 1.
Xato bo'lsa tsc nol bo'lmagan kod qaytaradi, demak qurish
to'xtaydi. Xatosi yo'q faylda esa:
function chegirma(narx: number, foiz: number): number {
return narx - narx * foiz / 100;
}
console.log(chegirma(10000, 20));
tsc narx2.ts --noEmit && echo "xato yo'q, kod: $?"
xato yo'q, kod: 0
TypeScript qanday paydo bo'ldi? #
2010-yillarga kelib JavaScript kichik skriptlar tilidan katta ilovalar tiliga aylandi. Microsoft ichida Office veb versiyasi kabi yuz minglab qatorli loyihalar paydo bo'ldi - va ularni JavaScript da saqlash qiyinlashdi.
Anders Hejlsberg bu ishga boshchilik qildi. U allaqachon Turbo Pascal, Delphi va C# ni yaratgan tajribali til dizayneri edi.
2012-yilning oktyabrida TypeScript ochiq kod sifatida e'lon qilindi. Uning asosiy g'oyasi g'ayrioddiy edi: yangi til yaratish emas, balki JavaScript ning ustiga qatlam qo'shish.
Bu shunchaki shior emas, balki tilning asosiy qoidasi.
Mavjud .js faylingizni .ts ga qayta nomlasangiz, u ishlashda
davom etadi. Turlar esa asta-sekin qo'shiladi.
Aynan shu narsa katta loyihalarni bosqichma-bosqich ko'chirish imkonini beradi - 18-bobda buni amalda ko'ramiz.
Turlar ishga tushirishda yo'q #
Bu TypeScript ni tushunishdagi eng muhim nuqta.
Brauzer ham, Node.js ham TypeScript ni tushunmaydi. tsc
kodni oddiy JavaScript ga aylantiradi va turlar shu paytda
butunlay o'chib ketadi.
Manba fayl:
type Mahsulot = { nomi: string; narx: number };
const m: Mahsulot = { nomi: "Olma", narx: 12000 };
console.log(m.nomi);
Uni kompilyatsiya qilib, natijaga qaraymiz:
tsc yoqoladi.ts --target es2022 --module esnext --moduleResolution bundler
cat yoqoladi.js
const m = { nomi: "Olma", narx: 12000 };
console.log(m.nomi);
type Mahsulot ham, : Mahsulot ham natijada yo'q.
Bu eng ko'p uchraydigan noto'g'ri tushuncha.
const javob = await fetch("/api/mahsulot");
const m: Mahsulot = await javob.json();
Bu yerda : Mahsulot - shunchaki va'da. Server butunlay
boshqa narsa qaytarsa, TypeScript hech narsa demaydi, chunki
tekshiruv ish vaqtida umuman mavjud emas.
Tashqi ma'lumot uchun zod kabi ish vaqtida tekshiradigan
kutubxona kerak - 16-bobda ko'ramiz.
Ishga tushirish #
Kompilyatsiya qilib, keyin node bilan ishga tushirish mumkin.
Lekin ishlab chiqish paytida qulayroq yo'l bor - tsx TypeScript
faylni to'g'ridan-to'g'ri bajaradi:
tsx narx2.ts
8000
Oraliq .js fayl yaratilmadi.
Tur xulosasi - hamma joyga yozish shart emas #
TypeScript turni o'zi topadi:
let nomi = "Olma";
nomi = 5;
Birinchi qatorda tur yozilmagan, lekin TypeScript nomi ni
string deb biladi:
tsc xulosa.ts --noEmit 2>&1 | fold -sw 74
xulosa.ts(2,1): error TS2322: Type 'number' is not assignable to type
'string'.
Shuning uchun TypeScript kodi odatda o'ylagandan ancha kam tur yozuvi bilan yoziladi. Buni 3-bobda batafsil ko'ramiz.
Nima yutamiz va nima yo'qotamiz? #
| Yutuq | Narx |
|---|---|
| Xatolar ishga tushmasdan topiladi | Qurish qadami qo'shiladi |
| Tahrirlovchi aniq maslahat beradi | O'rganishga vaqt kerak |
| Refaktoring xavfsiz bo'ladi | Turlarni saqlab turish kerak |
| Kod o'zini hujjatlaydi | Ba'zan turlar murakkablashadi |
| Jamoada kelishuv aniq bo'ladi | Kutubxonaga @types kerak bo'lishi mumkin |
- Yigirma qatorli skript
- Bir martalik tajriba
- Jamoada hech kim bilmasa va o'rganishga vaqt bo'lmasa
Loyiha bir necha ming qatordan oshsa yoki unda bir nechta odam ishlasa, TypeScript deyarli har doim o'zini oqlaydi.
Versiyalar #
Bu darslikda ishlatilgan versiyalar:
tsc --version
node --version
Version 5.7.3
v22.23.2
Xulosa #
- JavaScript noto'g'ri turdagi qiymatni jim qabul qiladi -
chegirma(10000)bizgaNaNqaytardi va hech qanday xato bermadi. - TypeScript xuddi shu xatoni kod yozilayotganda topadi.
- Xato xabari aniq: fayl, qator, ustun, xato kodi va tavsif.
tscxato topsa nol bo'lmagan chiqish kodi qaytaradi - shuning uchun CI da qurish to'xtaydi.- TypeScript ni Anders Hejlsberg boshchiligida Microsoft yaratgan, 2012-yilda ochiq kod sifatida e'lon qilingan.
- Asosiy qaror - yangi til emas, JavaScript ustiga qatlam:
har qanday
.jsallaqachon to'g'ri TypeScript. - Turlar ishga tushirishda yo'qoladi -
tscoddiy JavaScript chiqaradi. - Demak TypeScript tashqi ma'lumotni (API javobi, foydalanuvchi kiritgani) tekshirmaydi.
--noEmitfaqat tekshiradi;tsxesa faylni to'g'ridan-to'g'ri ishga tushiradi.- Tur xulosasi tufayli har joyga tur yozish shart emas.
chegirmafunksiyasini JavaScript da yozing va uchta noto'g'ri argument bilan chaqiring.- Uni
.tsga ko'chirib, turlarni qo'shing vatsc --noEmitbilan tekshiring. - Xato xabaridagi qator va ustun raqamini kodda toping.
echo $?bilan chiqish kodini tekshiring.- Toza faylda chiqish kodi nol ekanini tasdiqlang.
tscbilan.jschiqarib, turlar yo'qolganini ko'ring.tsxbilan.tsfaylni to'g'ridan-to'g'ri ishga tushiring.- Tur yozmasdan o'zgaruvchi e'lon qilib, unga boshqa turdagi qiymat bering.
- Xato kodini (masalan
TS2345) internetdan qidirib ko'ring. - O'z loyihangizdan bitta faylni
.tsga ko'chirib, nechta xato chiqishini sanang.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
Xatolik topdingizmi?
Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.