3-bo‘lim
Asosiy turlar va tur xulosasi
Ibtidoiy turlar, TypeScript turni qanday o'zi topishi, let va const farqi, any ning xavfi va massiv turlari.
Ushbu bo‘lim mundarijasi
TypeScript da turni har joyga yozish shart emas. Aksincha, tajribali kod ko'pincha juda kam tur yozuvi bilan yoziladi.
Bu bobda kompilyator nimani o'zi biladi va siz nimani aytishingiz kerakligini ajratamiz.
tsc src ichidagi barcha fayllarni birga kompilyatsiya
qiladi. Shuning uchun quyidagi namunalarni bitta papkaga birga
yig'masangiz yaxshi: import yoki export bo'lmagan fayllar
global sohani baham ko'radi va bir xil nom ikki marta e'lon
qilinsa TS2451 xatosi chiqadi.
Buni 11-bobda batafsil ko'ramiz. Hozircha har bir namunani sinab bo'lgach, eski faylni o'chirib turing.
Ibtidoiy turlar #
const nomi: string = "Olma";
const narx: number = 12000;
const bormi: boolean = true;
const katta: bigint = 9007199254740993n;
const belgi: symbol = Symbol("id");
console.log(typeof nomi, typeof narx, typeof bormi);
console.log(typeof katta, typeof belgi);
tsx src/turlar.ts
string number boolean
bigint symbol
| Tur | Nima saqlaydi |
|---|---|
string | Matn |
number | Butun va kasr sonlar (ikkalasi ham) |
boolean | true yoki false |
bigint | Juda katta butun sonlar |
symbol | Noyob identifikator |
null | "Qiymat yo'q" (ataylab) |
undefined | "Qiymat berilmagan" |
number bitta - int va float yo'qJavaScript da butun va kasr sonlar uchun bitta tur bor, va TypeScript shuni meros qilib oladi.
Demak 12000 ham, 0.5 ham number. Pul bilan ishlaganda bu
xavfli: 0.1 + 0.2 aniq 0.3 bermaydi.
Pulni eng kichik birlikda butun son sifatida saqlang - masalan tiyinda - yoki maxsus kutubxona ishlating.
Tur xulosasi #
Turni yozmasangiz, TypeScript uni qiymatdan topadi:
let nomi = "Olma";
let narx = 12000;
const a: typeof nomi = 5;
const b: typeof narx = "matn";
tsc --noEmit 2>&1 | fold -sw 74
src/xulosa.ts(4,7): error TS2322: Type 'number' is not assignable to type
'string'.
src/xulosa.ts(5,7): error TS2322: Type 'string' is not assignable to type
'number'.
Hech qayerda : string yozilmagan, lekin TypeScript nomi ni
string, narx ni number deb biladi.
typeof nomi - bu tur darajasidagi operator: u o'zgaruvchining
turini oladi. Uni 15-bobda batafsil ko'ramiz.
let va const - turlari boshqacha #
Bu ko'pchilik kutmaydigan tafsilot:
let o1 = "Olma";
const o2 = "Olma";
const x: "Anor" = o2;
tsc --noEmit 2>&1 | fold -sw 74
src/literal.ts(4,7): error TS2322: Type '"Olma"' is not assignable to
type '"Anor"'.
Xato xabaridagi turga qarang: '"Olma"' - bu string emas,
balki aynan o'sha matn.
const o'zgarmaydi, demak TypeScript uning turini imkon qadar
tor qiladi. Bunga literal tur deyiladi va u 14-bobning
asosiy mavzusi.
Tor turni kengroq joyga berish esa muammosiz:
const o2 = "Olma";
const y: string = o2;
const z: "Olma" | "Anor" = o2;
console.log(y, z);
tsx src/keng.ts
Olma Olma
Chunki "Olma" - bu ham string, ham "Olma" | "Anor" ning bir
qismi.
any - eshikni ochib qo'yish #
any "bu qiymatni tekshirma" degani:
let q: any = "matn";
q = 5;
q = { nomi: "Olma" };
console.log(q.yoq.narx);
tsc --noEmit && echo "any: hech qanday xato yo'q"
any: hech qanday xato yo'q
Kompilyator rozi. Ishga tushiramiz:
tsx src/hech.ts 2>&1 | grep -oE "TypeError.*" | head -1
TypeError: Cannot read properties of undefined (reading 'narx')
Aynan shu xatodan qochish uchun TypeScript ishlatilgan edi.
any yozilishi bilan himoya o'chdi.
any yuqumliany faqat bitta o'zgaruvchiga ta'sir qilmaydi - u undan
kelib chiqadigan hamma narsaga tarqaladi:
const ma: any = JSON.parse(matn);
const nomi = ma.foydalanuvchi.nomi; // nomi ham any
const uzunlik = nomi.length; // bu ham any
Bitta any butun zanjirni tekshiruvsiz qoldiradi.
Turi noma'lum qiymat uchun any emas, unknown ishlating -
u ishlatishdan oldin tekshirishni majbur qiladi. 15-bobda
ikkalasini solishtiramiz.
Yashirin any #
Ba'zan any siz yozmasdan paydo bo'ladi:
function salom(nomi) {
return "Salom, " + nomi;
}
tsc --noEmit 2>&1 | fold -sw 74
src/yashirin.ts(1,16): error TS7006: Parameter 'nomi' implicitly has an
'any' type.
strict (aniqrog'i noImplicitAny) buni ushlaydi. O'chirilgan
bo'lsa, funksiya jimgina tekshiruvsiz qolardi - 2-bobdagi tuzoq
aynan shu haqda edi.
Massivlar #
Ikki xil yozuv, bir xil ma'no:
const sonlar: number[] = [1, 2, 3];
const nomlar: Array<string> = ["Olma", "Anor"];
const aralash = [1, "matn", true];
console.log(sonlar.length, nomlar.length);
console.log(typeof aralash[0], typeof aralash[1]);
tsx src/massiv.ts
3 2
number string
number[] qisqaroq va ko'proq ishlatiladi. Array<string> esa
generiklarni o'rganganda tanish ko'rinadi (9-bob).
Aralash massivda TypeScript birlashma turini chiqaradi:
const aralash = [1, "matn", true];
const x: number = aralash[0];
tsc --noEmit 2>&1 | fold -sw 74
src/massiv2.ts(2,7): error TS2322: Type 'string | number | boolean' is
not assignable to type 'number'.
Type 'string' is not assignable to type 'number'.
Ikkinchi qator - qaysi qism mos kelmaganini aytadi. Murakkab turlarda bu qo'shimcha qatorlar eng foydali qismi bo'ladi.
Bo'sh massiv - o'suvchi tur #
Bu qiziq holat:
const bosh = [];
bosh.push(1);
bosh.push("matn");
const s: string = bosh[0];
tsc --noEmit 2>&1 | fold -sw 74
src/bosh.ts(4,7): error TS2322: Type 'string | number' is not assignable
to type 'string'.
Type 'number' is not assignable to type 'string'.
push larga e'tiroz yo'q. TypeScript bo'sh massivning turini
"o'sib boradigan" deb hisoblaydi va qo'shilgan qiymatlardan
string | number ni yig'adi.
Turi oldindan berilsa esa xato darhol chiqadi:
const sonlar: number[] = [];
sonlar.push(1);
sonlar.push("matn");
tsc --noEmit 2>&1 | fold -sw 74
src/bosh2.ts(3,13): error TS2345: Argument of type 'string' is not
assignable to parameter of type 'number'.
Endi xato uchinchi qatorda, ya'ni muammo sodir bo'lgan joyda - oldingi misolda esa u to'rtinchi qatorgacha yashiringan edi.
const buyurtmalar: Buyurtma[] = [];
Bu shunchaki uslub masalasi emas: xato qo'shilgan joyda topiladi, ishlatilgan joyda emas.
Qachon tur yozish kerak? #
| Holat | Yozish kerakmi |
|---|---|
const narx = 12000 | Yo'q - aniq ko'rinib turibdi |
| Funksiya parametrlari | Ha - har doim |
| Funksiya qaytish turi | Ko'pincha ha (hujjat sifatida) |
| Bo'sh massiv yoki obyekt | Ha |
JSON.parse natijasi | Ha - aks holda any bo'ladi |
| Oraliq o'zgaruvchi | Yo'q - xulosaga ishoning |
const narx = 12000;
function chegirma(narx: number, foiz: number): number {
return narx - narx * foiz / 100;
}
const natija = chegirma(narx, 20);
console.log(natija);
tsx src/qachon.ts
9600
Uch o'zgaruvchidan faqat funksiya chegarasida tur yozilgan.
narx va natija - xulosa bilan.
Funksiya parametrlari, eksport qilinadigan qiymatlar va tashqi ma'lumot - bular chegaralar, ularda tur aniq yozilsin.
Funksiya ichidagi oraliq o'zgaruvchilarga esa tur yozish ko'pincha shovqin qo'shadi: kompilyator allaqachon biladi, va kod o'zgarganda yozuvni ham yangilash kerak bo'ladi.
Xulosa #
- Ibtidoiy turlar:
string,number,boolean,bigint,symbol,null,undefined. numberbitta - butun va kasr uchun alohida tur yo'q; pulni eng kichik birlikda butun son qilib saqlang.- TypeScript turni qiymatdan o'zi topadi - har joyga yozish shart emas.
letkengroq tur beradi (string),constesa literal tur ("Olma"), chunki u o'zgarmaydi.anytekshiruvni butunlay o'chiradi va zanjir bo'ylab tarqaladi; turi noma'lum qiymat uchununknownyaxshiroq.noImplicitAnyyashirinanyni ushlaydi - turi yozilmagan parametrlarni.- Massiv uchun
number[]vaArray<number>bir xil. - Aralash massiv birlashma turini beradi; xato xabarining ikkinchi qatori qaysi qism mos kelmaganini aytadi.
- Bo'sh massiv "o'suvchi" turga ega - xato ishlatilgan joyda chiqadi, shuning uchun turini darhol yozing.
- Qoida: chegaralarda tur yozing, ichkarida xulosaga ishoning.
- Yettita ibtidoiy turdan har biriga o'zgaruvchi e'lon qiling.
typeofbilan ularning ish vaqtidagi turini chop eting.letvaconstbilan bir xil matn saqlab, turlarini solishtiring.constqiymatini tor literal turga berishga urinib ko'ring.anybilan mavjud bo'lmagan maydonga murojaat qiling vatscjim turganini tasdiqlang.- O'sha kodni
tsxbilan ishga tushirib, xatoni ko'ring. - Turi yozilmagan parametrli funksiya yozib,
TS7006ni chaqiring. - Aralash massiv yaratib, uning birlashma turini xato xabaridan o'qing.
- Bo'sh massivga ikki xil turdagi qiymat qo'shing va xato qayerda chiqishini yozing.
- O'z kodingizdan ortiqcha tur yozuvlarini olib tashlab,
tschamon toza ekanini tekshiring.
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.