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
doublefunksiyasini JavaScript’da yozib, satr bering vaNaNnatijasini ko’ring;- Xuddi shu funksiyani
.tsfaylida tur bilan yozib,nodebilan to’g’ridan-to’g’ri ishga tushiring; typescriptva@types/nodeni o’rnatib,npx tsc --noEmitbilan tekshiring va xato xabarini o’qing;tsconfig.jsonyaratib,rootDirvaoutDirni to’ldiring;npx tscbilandistpapkasini hosil qiling va undagi faylninodebilan yuriting;typeyordamida 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
.tsfaylini ishga tushiradi, lekin turlarni tekshirmaydi. - Haqiqiy tekshiruvni
tscbajaradi,--noEmitfaqat tekshirish uchun. @types/nodestandart modullarning tur tavsiflarini beradi.tsconfig.jsondarootDirvaoutDirjuft yoziladi.strict: trueundefinedbilan bog’liq xatolarning katta qismini oldini oladi.- Xato topilsa kompilyatsiya natija yaratmaydi — noto’g’ri kod
distga o’tmaydi.
Keyingi darsda server xavfsizligi — maxfiy kalitlar va bog’liqlik xavfi.