Node.js va TypeScript

Xatolar va jurnal darsida xatoni dastur ishlayotganda ushlashni o’rgandingiz. Endi savol boshqacha: xatoni ishga tushirishdan oldin topish mumkinmi?

Ba’zi xatolar uchun mumkin. Funksiya songa mo’ljallangan bo’lsa-yu, unga satr berilsa — buni oldindan aytish mumkin. TypeScript aynan shuni qiladi.

Muammoni ko’rsatamiz

Oddiy JavaScript kodi:

function double(value) {
  return value * 2;
}

console.log(double(5));
console.log(double("salom"));
node double-demo.js
10
NaN

Dastur yiqilmadi. U NaN qaytardi va ishlashda davom etdi.

Eng yomoni shu: xato hisobotga, hisobot esa foydalanuvchiga yetib boradi. Sabab qidirish esa ancha vaqt oladi.

TypeScript nima

Muhim jihati: har qanday ishlaydigan JavaScript kodi TypeScript uchun ham to’g’ri kod. Ya’ni noldan o’rganish shart emas, bilganingiz ustiga qo’shiladi.

Node.js .ts faylini o’zi ishga tushiradi

Uzoq yillar TypeScript kodini avval JavaScript’ga aylantirish kerak edi. Hozirgi Node.js versiyalari .ts faylini to’g’ridan-to’g’ri o’qiydi.

greet.ts faylini yarating:

type User = {
  name: string;
  age: number;
};

function greet(user: User): string {
  return `Salom, ${user.name}! Yoshingiz ${user.age}.`;
}

const aziz: User = { name: "Aziz", age: 25 };
console.log(greet(aziz));
node greet.ts
Salom, Aziz! Yoshingiz 25.

Hech narsa o’rnatilmadi va sozlanmadi.

Asosiy turlar

const title: string = "Node.js darsi";
const count: number = 42;
const isPublished: boolean = true;
const tags: string[] = ["node", "backend"];

console.log(title, count, isPublished, tags.length);
node types-demo.ts
Node.js darsi 42 true 2

Ko’p holatda turni yozish shart emas — TypeScript uni qiymatdan o’zi aniqlaydi:

// TypeScript buni string deb biladi
const title = "Node.js darsi";

// Bu esa number
const count = 42;

console.log(typeof title, typeof count);
string number

Tur asosan funksiya parametrlarida yoziladi: qiymat qayerdan kelishi noma’lum joy aynan shu.

Obyekt turi

Takrorlanadigan shakl uchun type e’lon qilinadi:

type Book = {
  title: string;
  author: string;
  year?: number;
};

function describe(book: Book): string {
  if (book.year) {
    return `${book.title} — ${book.author}, ${book.year}`;
  }
  return `${book.title} — ${book.author}`;
}

console.log(describe({ title: "O'tkan kunlar", author: "Abdulla Qodiriy", year: 1926 }));
console.log(describe({ title: "Shum bola", author: "G'afur G'ulom" }));
node book-demo.ts
O'tkan kunlar — Abdulla Qodiriy, 1926
Shum bola — G'afur G'ulom

year? dagi savol belgisi maydon majburiy emasligini bildiradi. Uni ishlatishdan oldin if bilan tekshirilgani ham shundan.

tsc — haqiqiy tekshiruvchi

Endi turlarni tekshiradigan vositani o’rnatamiz:

npm install --save-dev typescript @types/node
added 2 packages in 4s

Tekshiruvni sinaymiz. broken.ts:

function double(value: number): number {
  return value * 2;
}

console.log(double("salom"));
npx tsc --noEmit broken.ts
broken.ts(5,20): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

Mana farq. Bu xabar kod ishga tushirilmasdan oldin chiqdi. Qator raqami, ustun va sabab aniq ko’rsatilgan.

--noEmit — faqat tekshir, fayl yaratma degani.

tsconfig.json

Har safar fayl nomini yozmaslik uchun sozlama fayli yaratiladi. tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2022",
    "module": "commonjs",
    "rootDir": "src",
    "outDir": "dist",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src"]
}
Sozlama Vazifasi
target Qaysi JavaScript versiyasiga aylantiriladi
rootDir Manba fayllar qayerda
outDir Natija qayerga yoziladi
strict Qat’iy tekshiruv rejimi
include Qaysi papka tekshiriladi

Kompilyatsiya

greet.ts ni src papkasiga ko’chiring va yuriting:

npx tsc

Buyruq jim tugadi — demak xato yo’q. Natijani ko’ramiz:

ls dist
greet.js
node dist/greet.js
Salom, Aziz! Yoshingiz 25.

Endi dist papkasidagi fayl — oddiy JavaScript. Uni TypeScript o’rnatilmagan serverda ham ishga tushirish mumkin.

Xatoni tsconfig bilan tutish

Sozlama tayyor bo’lgach, tekshiruv butun papkaga tegishli bo’ladi. src/strict-demo.ts yarating:

function double(value: number): number {
  return value * 2;
}

console.log(double("salom"));
npx tsc
src/strict-demo.ts(4,20): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.

Xato topilgani uchun dist yangilanmadi. Bu muhim xususiyat: noto’g’ri kod natijaga o’tmaydi.

package.json skriptlari

Buyruqlarni yozib qo’ying:

{
  "scripts": {
    "check": "tsc --noEmit",
    "build": "tsc",
    "start": "node dist/greet.js"
  }
}
npm run check

Xato bo’lmasa buyruq jim tugaydi.

Bu skriptni testlar bilan birga yuritish odat tusiga kiradi: avval turlar tekshiriladi, so’ng testlar.

Turlar bilan Node modullari

@types/node o’rnatilgach, standart modullar ham tur bilan ishlaydi:

import { readFile } from "node:fs/promises";
import path from "node:path";

async function readNotes(fileName: string): Promise<string> {
  const filePath = path.join(__dirname, fileName);
  try {
    return await readFile(filePath, "utf8");
  } catch (error) {
    // catch dagi qiymat turi noma'lum — tekshirish kerak
    if (error instanceof Error) {
      console.log("Xato:", error.message);
    }
    return "";
  }
}

readNotes("yoq.txt").then((text) => {
  console.log("Uzunlik:", text.length);
});
node notes.ts
Xato: ENOENT: no such file or directory, open 'D:\ts-start\yoq.txt'
Uzunlik: 0

error instanceof Error tekshiruviga e’tibor bering. catch blokidagi qiymat turi oldindan noma’lum, shuning uchun strict rejimida uni to’g’ridan-to’g’ri ishlatishga ruxsat berilmaydi.

Qachon TypeScript kerak

Holat Tavsiya
Kichik skript, bir martalik vazifa JavaScript yetarli
Uzoq yashaydigan loyiha TypeScript
Jamoada ishlash TypeScript
Kutubxona yozish TypeScript

Turlar kodni uzaytiradi, lekin funksiyani qanday chaqirish kerakligini hujjatsiz aytib turadi. Loyiha qancha uzoq yashasa, foyda shuncha sezilarli.

Kod sifatini oshirishning boshqa vositalari kod sifati darsida ko’rilgan — TypeScript ularni almashtirmaydi, to’ldiradi.

Amaliy mashq

  1. double funksiyasini JavaScript’da yozib, satr bering va NaN natijasini ko’ring;
  2. Xuddi shu funksiyani .ts faylida tur bilan yozib, node bilan to’g’ridan-to’g’ri ishga tushiring;
  3. typescript va @types/node ni o’rnatib, npx tsc --noEmit bilan tekshiring va xato xabarini o’qing;
  4. tsconfig.json yaratib, rootDir va outDir ni to’ldiring;
  5. npx tsc bilan dist papkasini hosil qiling va undagi faylni node bilan yuriting;
  6. type yordamida obyekt turi e’lon qilib, majburiy bo’lmagan maydonni ? bilan belgilang.

3-qadam eng muhimi: Node.js .ts faylini ishga tushirishi turlarni tekshirishini anglatmaydi — tekshiruv alohida qadam.

Qisqacha xulosa

  • TypeScript JavaScript ustiga tur qo’shadi, mavjud kod o’zgarishsiz ishlaydi.
  • Node.js .ts faylini ishga tushiradi, lekin turlarni tekshirmaydi.
  • Haqiqiy tekshiruvni tsc bajaradi, --noEmit faqat tekshirish uchun.
  • @types/node standart modullarning tur tavsiflarini beradi.
  • tsconfig.json da rootDir va outDir juft yoziladi.
  • strict: true undefined bilan bog’liq xatolarning katta qismini oldini oladi.
  • Xato topilsa kompilyatsiya natija yaratmaydi — noto’g’ri kod dist ga o’tmaydi.

Keyingi darsda server xavfsizligi — maxfiy kalitlar va bog’liqlik xavfi.

Bu dars foydali bo'ldimi?

marta ko'rildi