TypeScript’ga migratsiya


JavaScript-dan TypeScript-ga o‘tish kod bazasining barqarorligi va ishlab chiquvchi tajribasini sezilarli darajada yaxshilashi mumkin.

Ushbu qo‘llanma sizga jarayonni bosqichma-bosqich yo‘naltiradi.


ULASHISH

Tayyorgarlik bosqichi

Kod bazangizni baholang

Migratsiyani boshlashdan oldin:

  • Kod bazasining hajmi va murakkabligini aniqlang
  • Qurilish jarayoni va bog‘liqliklarni hujjatlashtiring
  • Mavjud tip ta’riflarini (.d.ts fayllarini) tekshiring
  • Alohida e’tibor talab qiladigan muhim yo‘llarni aniqlang

Versiya boshqaruvini sozlash

Sizda toza git ombori yoki ekvivalentiga ega ekanligingizga ishonch hosil qiling:

# Create a new branch for the migration
git checkout -b typescript-migration

# Commit your current state
git add .
git commit -m "Pre-TypeScript migration state"

Konfiguratsiya

TypeScript-ni o‘rnating

# Install TypeScript as a dev dependency
npm install --save-dev typescript @types/node

tsconfig.json yarating

Boshlash uchun asosiy tsconfig.json yarating:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

Eslatma: target ni minimal qo‘llab-quvvatlanadigan muhitlar asosida sozlang.



Migratsiya yondashuvlari

Asta-sekin migratsiya

Bir vaqtning o‘zida bitta faylni ko‘chiring, qolganlarini JavaScript sifatida saqlang.

{
  "compilerOptions": {
    "allowJs": true,
    "checkJs": true
  }
}

Best for: Katta kod bazalari, minimal buzilish

Birdaniga migratsiya

Barcha .js fayllar nomini .ts ga o‘zgartiring va xatolarni tuzating.

# Rename all JS files to TS
find src -name "*.js" -exec sh -c 'mv "$0" "${0%.js}.ts"' {} \;

Best for: Kichik va o‘rta loyihalar, yashil maydon loyihalari

Muhim eslatma

Yirik loyihalarda uzilishlarni minimallashtirish va jarayonni boshqarish mumkin bo‘lishi uchun bosqichma-bosqich migratsiya yondashuvini qat’iy tavsiya qilamiz.


Bosqichma-bosqich migratsiya

Konfiguratsiya bilan boshlang

Tavsiya etilgan sozlamalar bilan asosiy tsconfig.json yarating:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "allowJs": true,
    "checkJs": true,
    "noEmit": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

JavaScript uchun Turni tekshirishni yoqing

Turni tekshirishni yoqish uchun JavaScript fayllaringizning yuqori qismiga // @ts-check qo‘shing:

// @ts-check

/** @type {string} */
const name = 'John';

// TypeScript will catch this error
name = 42; // Error: Type '42' is not assignable to type 'string'

Eslatma: // @ts-ignore dan foydalanib, muayyan qatorlar turini tekshirishni o‘chirib qo‘yishingiz mumkin.

Fayllar nomini .ts ga o‘zgartiring

Muhim bo‘lmagan fayllardan boshlang va ularni .js dan .ts ga o‘zgartiring:

# Rename a single file
mv src/utils/helpers.js src/utils/helpers.ts

# Or rename all files in a directory (use with caution)
find src/utils -name "*.js" -exec sh -c 'mv "$0" "${0%.js}.ts"' {} \;

Turga izoh qo‘shish

Kodingizga asta-sekin turdagi izohlarni qo‘shing:

// Before
function add(a, b) {
  return a + b;
}

// After
function add(a: number, b: number): number {
  return a + b;
}

// With interface
interface User {
  id: number;
  name: string;
  email?: string;
}

function getUser(id: number): User {
  return { id, name: 'John Doe' };
}

Qurilish va sinov skriptlarini yangilang

TypeScript kompilyatsiyasini kiritish uchun package.json-ni o‘zgartiring:

{
  "scripts": {
    "build": "tsc",
    "dev": "tsc --watch",
    "test": "jest"
  }
}

Eslatma: TypeScript fayllari bilan ishlash uchun test konfiguratsiyasini yangilaganingizga ishonch hosil qiling.


Migratsiya vositalari

ts-migratsiya

JavaScript-ni TypeScript-ga ko‘chirish uchun avtomatlashtirilgan vosita

npx ts-migrate-full .

GitHub Repository

TypeStat

JavaScript-ni xavfsizlik turi bilan TypeScript-ga o‘zgartiradi

npx typestat

GitHub Repository

@types paketlar

O‘zingizning bog‘liqliklaringiz uchun turdagi ta’riflarni o‘rnating

npm install --save-dev @types/react @types/node

TypeSearch


TypeScript migratsiyasi uchun eng yaxshi amaliyotlar

Kichik va takrorlashni boshlang

  • Utility funksiyalari va UI bo‘lmagan komponentlar bilan boshlang
  • Bir vaqtning o‘zida bitta fayl yoki modulni ko‘chiring
  • Har bir muvaffaqiyatli migratsiya bosqichidan keyin amal qiling

TypeScript xususiyatlaridan foydalaning

Misol

// Use type inference where possible
const name = 'John'; // TypeScript infers 'string'
const age = 30; // TypeScript infers 'number'

// Use union types for flexibility
type Status = 'active' | 'inactive' | 'pending';

// Use type guards for runtime checks
function isString(value: any): value is string {
  return typeof value === 'string';
}

Uchinchi tomon kutubxonalari bilan ishlash

  • O‘zingizning bog‘liqliklaringiz uchun @types paketlarini o‘rnating
  • Turlarsiz kutubxonalar uchun deklaratsiya fayllarini yarating
  • Global turdagi kengaytmalar uchun declare module dan foydalaning

Umumiy muammolar va yechimlar

Dinamik xususiyatlar

Problem: JavaScript ko‘pincha obyektlardan lug‘at sifatida foydalanadi.

Misol

// Before
const user = {};
user.name = 'John'; // Error: Property 'name' does not exist

Solution: Indeks imzolaridan foydalaning yoki tasdiqlarni yozing.

Misol

// Option 1: Index signature
interface User {
  [key: string]: any;
}
const user: User = {};
user.name = 'John'; // OK

// Option 2: Type assertion
const user = {} as { name: string };
user.name = 'John'; // OK

this Kontekst bilan ishlash

Problem: this callback funksiyasilarda majburiy muammolar.

Misol

class Counter {
  count = 0;
  increment() {
    setTimeout(function() {
      this.count++; // Error: 'this' is not defined
    }, 1000);
  }
}

Solution: Arrow funksiyalaridan foydalaning yoki this bog‘lang.

Misol

// Solution 1: Arrow function
setTimeout(() => {
  this.count++; // 'this' is lexically scoped
}, 1000);

// Solution 2: Bind 'this'
setTimeout(function(this: Counter) {
  this.count++;
}.bind(this), 1000);

Xulosa

JavaScript-dan TypeScript-ga o‘tish kodlar bazasiga muhim, ammo foydali sarmoyadir.

Ushbu qo‘llanmaga amal qilib, siz o‘tishni muammosiz va bosqichma-bosqich amalga oshirishingiz mumkin.

Asosiy xulosalar:

  • Qattiq tsconfig.json konfiguratsiyasidan boshlang
  • Sekin-asta ko‘chirish uchun allowJs va checkJs dan foydalaning
  • Xatolarni erta aniqlash uchun TypeScript turi tizimidan foydalaning
  • TypeScript-ni qo‘llab-quvvatlash uchun qurish va sinov jarayonlarini yangilang
  • Yuqorida ko‘rsatilgan naqshlar bilan umumiy muammolarni hal qiling

Migratsiya hodisa emas, balki jarayon ekanligini unutmang.

O‘tish davrida aralash kod bazasiga ega bo‘lish yaxshi.

Eng muhimi, kod sifatini saqlab qolish bilan birga taraqqiyotni davom ettirishdir.

Migratsiyani boshlashga tayyormisiz?

Loyihangizda TypeScript-ni sozlashdan boshlang va tur izohlarini asta-sekin qo‘shib boring.

TypeScript kompilyatori sizning kodingizni yanada mustahkam va barqaror qilish jarayoni bo‘yicha sizga yo‘l ko‘rsatadi.

Qo‘shimcha ma’lumot olish uchun official TypeScript migration guide ga qarang.




W3Schools Pathfinder

Yutuqlaringizni kuzating – bu bepul!