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.

🕑 21 daqiqa o‘qish 📄 894 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ibtidoiy turlar
  2. Tur xulosasi
  3. let va const - turlari boshqacha
  4. any - eshikni ochib qo'yish
  5. Yashirin any
  6. Massivlar
  7. Bo'sh massiv - o'suvchi tur
  8. Qachon tur yozish kerak?
  9. Xulosa

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.

Har bir namuna alohida fayl

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 #

TS
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);
Terminal
tsx src/turlar.ts
Natija
string number boolean
bigint symbol
TurNima saqlaydi
stringMatn
numberButun va kasr sonlar (ikkalasi ham)
booleantrue yoki false
bigintJuda katta butun sonlar
symbolNoyob identifikator
null"Qiymat yo'q" (ataylab)
undefined"Qiymat berilmagan"
number bitta - int va float yo'q

JavaScript 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:

TS
let nomi = "Olma";
let narx = 12000;

const a: typeof nomi = 5;
const b: typeof narx = "matn";
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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:

TS
let o1 = "Olma";
const o2 = "Olma";

const x: "Anor" = o2;
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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.

Bir xil qiymat, ikki xil tur let o1 = "Olma" turi: string Keyin o'zgarishi mumkin, shuning uchun tur keng olinadi. o1 = "Anor" - ruxsat const o2 = "Olma" turi: "Olma" Hech qachon o'zgarmaydi, shuning uchun tur tor olinadi. literal tur Tor tur foydaliroq: u faqat mumkin bo'lgan qiymatlarni ko'rsatadi.
const o'zgarmaganligi uchun TypeScript aniqroq tur beradi

Tor turni kengroq joyga berish esa muammosiz:

TS
const o2 = "Olma";
const y: string = o2;
const z: "Olma" | "Anor" = o2;
console.log(y, z);
Terminal
tsx src/keng.ts
Natija
Olma Olma

Chunki "Olma" - bu ham string, ham "Olma" | "Anor" ning bir qismi.

any - eshikni ochib qo'yish #

any "bu qiymatni tekshirma" degani:

TS
let q: any = "matn";
q = 5;
q = { nomi: "Olma" };
console.log(q.yoq.narx);
Terminal
tsc --noEmit && echo "any: hech qanday xato yo'q"
Natija
any: hech qanday xato yo'q

Kompilyator rozi. Ishga tushiramiz:

Terminal
tsx src/hech.ts 2>&1 | grep -oE "TypeError.*" | head -1
Natija
TypeError: Cannot read properties of undefined (reading 'narx')

Aynan shu xatodan qochish uchun TypeScript ishlatilgan edi. any yozilishi bilan himoya o'chdi.

any yuqumli

any faqat bitta o'zgaruvchiga ta'sir qilmaydi - u undan kelib chiqadigan hamma narsaga tarqaladi:

Natija
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:

TS
function salom(nomi) {
  return "Salom, " + nomi;
}
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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:

TS
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]);
Terminal
tsx src/massiv.ts
Natija
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:

TS
const aralash = [1, "matn", true];
const x: number = aralash[0];
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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:

TS
const bosh = [];
bosh.push(1);
bosh.push("matn");
const s: string = bosh[0];
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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:

TS
const sonlar: number[] = [];
sonlar.push(1);
sonlar.push("matn");
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
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.

Bo'sh massivga turini darhol bering
Natija
const buyurtmalar: Buyurtma[] = [];

Bu shunchaki uslub masalasi emas: xato qo'shilgan joyda topiladi, ishlatilgan joyda emas.

Qachon tur yozish kerak? #

HolatYozish kerakmi
const narx = 12000Yo'q - aniq ko'rinib turibdi
Funksiya parametrlariHa - har doim
Funksiya qaytish turiKo'pincha ha (hujjat sifatida)
Bo'sh massiv yoki obyektHa
JSON.parse natijasiHa - aks holda any bo'ladi
Oraliq o'zgaruvchiYo'q - xulosaga ishoning
TS
const narx = 12000;

function chegirma(narx: number, foiz: number): number {
  return narx - narx * foiz / 100;
}

const natija = chegirma(narx, 20);
console.log(natija);
Terminal
tsx src/qachon.ts
Natija
9600

Uch o'zgaruvchidan faqat funksiya chegarasida tur yozilgan. narx va natija - xulosa bilan.

Qoida: chegaralarda yozing, ichkarida ishoning

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.
  • number bitta - 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.
  • let kengroq tur beradi (string), const esa literal tur ("Olma"), chunki u o'zgarmaydi.
  • any tekshiruvni butunlay o'chiradi va zanjir bo'ylab tarqaladi; turi noma'lum qiymat uchun unknown yaxshiroq.
  • noImplicitAny yashirin any ni ushlaydi - turi yozilmagan parametrlarni.
  • Massiv uchun number[] va Array<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.
Amaliy topshiriq
  1. Yettita ibtidoiy turdan har biriga o'zgaruvchi e'lon qiling.
  2. typeof bilan ularning ish vaqtidagi turini chop eting.
  3. let va const bilan bir xil matn saqlab, turlarini solishtiring.
  4. const qiymatini tor literal turga berishga urinib ko'ring.
  5. any bilan mavjud bo'lmagan maydonga murojaat qiling va tsc jim turganini tasdiqlang.
  6. O'sha kodni tsx bilan ishga tushirib, xatoni ko'ring.
  7. Turi yozilmagan parametrli funksiya yozib, TS7006 ni chaqiring.
  8. Aralash massiv yaratib, uning birlashma turini xato xabaridan o'qing.
  9. Bo'sh massivga ikki xil turdagi qiymat qo'shing va xato qayerda chiqishini yozing.
  10. O'z kodingizdan ortiqcha tur yozuvlarini olib tashlab, tsc hamon toza ekanini tekshiring.

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.