TypeScript nima va u nima uchun kerak?

JuniorTypeScript #typescript #basics

Savol

TypeScript nima, u JavaScript'dan nimasi bilan farq qiladi va uni nima uchun ishlatish kerak?

Qisqa javob

TypeScript — bu statik tiplashni qo'shuvchi JavaScript kengaytmasi. U brauzerda to'g'ridan-to'g'ri ishlamaydi: kompilyator (tsc) tiplarni tekshiradi va kodni oddiy JavaScript'ga transpilyatsiya qiladi, shundan so'ng tiplar butunlay yo'qoladi — runtime'da ular mavjud emas.

Batafsil javob

Har qanday to'g'ri JavaScript kodi — to'g'ri TypeScript kodi hamdir: TS tilni almashtirmaydi, balki uning ustiga qo'shiladi. TypeScript ishlatishning asosiy sabablari:

  • Kompilyatsiya bosqichida tip tekshiruvi. Mavjud bo'lmagan xususiyatga murojaat qilish yoki number o'rniga string uzatish kabi xatolar kod ishga tushmasdan oldin, runtime'da emas, aniqlanadi.
  • IDE'da avtomatik to'ldirish va refaktoring. Tiplar muharrirga maslahatlar berish, ta'rifga o'tish va xavfsiz nomlarni o'zgartirish uchun ma'lumot beradi.
  • Kod ichidagi hujjatlashtirish. Funksiya signaturalari va interfeyslar alohida izohlarsiz kontraktni tasvirlaydi.
  • Tiplar kompilyatsiyada o'chiriladi (erasure). Runtime'da tip tekshiruvi bo'ladigan tillardan (Java, C#) farqli o'laroq, TypeScript bajarilish vaqtida hech qanday tip tekshiruvini qo'shmaydi — barcha nazorat faqat tsc bosqichida amalga oshadi.

TypeScript nominativ emas, strukturaviy tiplash (structural typing / duck typing) ishlatadi. Tiplarning mosligi klass nomi yoki merosxo'rlikning aniq e'lon qilinishi bilan emas (Java yoki C#'da implements deb aniq yozish kerak bo'lgani kabi), balki shakli (maydonlar to'plami va ularning tiplari) bilan aniqlanadi.

interface Point { x: number; y: number }

function printPoint(p: Point) {
  console.log(`${p.x}, ${p.y}`)
}

// obyekt hech qayerda Point sifatida e'lon qilinmagan, lekin shakli mos keladi
const vector = { x: 10, y: 20, z: 30 }
printPoint(vector) // OK — ortiqcha maydonlar xalaqit bermaydi, faqat struktura mosligi muhim

Nominativ tip tizimida (Java) xuddi shu chaqiruv Point interfeysini aniq amalga oshirishni talab qilardi. TypeScript'da esa obyekt kerakli shaklga strukturaviy jihatdan mos kelishi kifoya.

Misol

// basics.ts
let age: number = 30
let name: string = 'Alice'
let isAdmin: boolean = false

// xato kompilyatsiya bosqichida aniqlanadi, runtime'da emas
// age = 'thirty' // Type 'string' is not assignable to type 'number'

function greet(user: { name: string; age: number }): string {
  return `Salom, ${user.name}, sen ${user.age} yoshdasan`
}

// JS'ga kompilyatsiya qilingandan keyin barcha tip annotatsiyalari yo'qoladi:
// function greet(user) { return `Salom, ${user.name}, sen ${user.age} yoshdasan`; }
console.log(greet({ name, age }))

Qo'shimcha savollar

  • Strukturaviy tiplash nominativdan nimasi bilan farq qiladi va TypeScript qayerda "deyarli nominativ" tarzda o'zini tutadi (masalan, klassning private maydonlari bilan)?
  • tsconfig.json nima va strict flagi nima uchun javobgar?
  • Nega TypeScript alohida til emas, balki "kengaytma" (superset) deb ataladi?