18-bo‘lim

JS loyihasini ko'chirish

allowJs va checkJs, JSDoc bilan turlash, @ts-check, @ts-expect-error va bosqichma-bosqich qat'iylashtirish.

🕑 22 daqiqa o‘qish 📄 849 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Boshlang'ich holat
  2. Birinchi qadam: allowJs va checkJs
  3. JSDoc bilan turlash
  4. @ts-ignore va @ts-expect-error
  5. .ts ga qayta nomlash
  6. Chiqish va incremental
  7. Ko'chirish tartibi
  8. Xulosa

Ko'pchilik TypeScript ni bo'sh papkada boshlamaydi - mavjud JavaScript loyihasiga qo'shadi.

Yaxshi xabar: bu bir kunda qilinadigan ish emas va shunday bo'lishi kerak ham emas. TypeScript ataylab bosqichma-bosqich ko'chirish uchun mo'ljallangan.

Boshlang'ich holat #

JavaScript
export function chegirma(narx, foiz) {
  return narx - (narx * foiz) / 100;
}
JavaScript
import { chegirma } from "./dokon.js";

console.log(chegirma(50000, 20));
console.log(chegirma(50000));
Terminal
tsx src/asosiy.js
Natija
40000
NaN

Ikkinchi chaqiruvda foiz berilmadi va natija NaN bo'ldi. Dastur yiqilmadi ham, ogohlantirmadi ham - NaN shunchaki oqib ketaveradi.

Birinchi qadam: allowJs va checkJs #

JavaScript
export function chegirma(narx, foiz) {
  return narx - (narx * foiz) / 100;
}
JavaScript
import { chegirma } from "./dokon.js";

console.log(chegirma(50000, 20));
console.log(chegirma(50000));
Terminal
echo "--- faqat allowJs ---"
tsc --noEmit --allowJs && echo "xato yo_q"
echo "--- allowJs va checkJs ---"
tsc --noEmit --allowJs --checkJs 2>&1 | fold -sw 74
Natija
--- faqat allowJs ---
xato yo_q
--- allowJs va checkJs ---
src/dokon.js(1,26): error TS7006: Parameter 'narx' implicitly has an
'any' type.
src/dokon.js(1,32): error TS7006: Parameter 'foiz' implicitly has an
'any' type.
SozlamaNima qiladi
allowJs.js fayllarni loyihaga qo'shadi
checkJsUlarni ham tekshiradi

Katta loyihada checkJs ni birdan yoqish yuzlab xato beradi. Shuning uchun fayl-fayl yoqish mumkin:

JavaScript
export function qqs(narx) {
  return narx * 1.12;
}

console.log(qqs());
JavaScript
// @ts-check

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

console.log(chegirma(50000));
Terminal
tsc --noEmit --allowJs 2>&1 | fold -sw 74
Natija
src/tekshirilgan.js(3,26): error TS7006: Parameter 'narx' implicitly has
an 'any' type.
src/tekshirilgan.js(3,32): error TS7006: Parameter 'foiz' implicitly has
an 'any' type.

Ikkala faylda ham bir xil muammo bor, lekin faqat @ts-check yozilgani haqida xabar berildi.

Teskarisi ham bor

checkJs: true yoqilgan bo'lsa, ayrim fayllarni chetlab o'tish uchun ular boshiga // @ts-nocheck yoziladi.

Amaliy strategiya:

  1. allowJs: true, checkJs: false - hech narsa buzilmaydi;
  2. fayllarga birma-bir // @ts-check qo'shib, tuzatib chiqiladi;
  3. ko'pchiligi tuzalgach, checkJs: true qilinadi va qolganlariga // @ts-nocheck qo'yiladi;
  4. // @ts-nocheck lar asta-sekin olib tashlanadi.

Har bir qadam mustaqil va qaytariladigan.

JSDoc bilan turlash #

.js faylda ham to'liq turlash mumkin - izohlar orqali:

JavaScript
// @ts-check

/**
 * Narxdan foizli chegirma ayiradi.
 *
 * @param {number} narx - boshlangich narx
 * @param {number} foiz - chegirma foizi
 * @returns {number} yakuniy narx
 */
export function chegirma(narx, foiz) {
  return narx - (narx * foiz) / 100;
}

console.log(chegirma("50000", 20));
Terminal
tsc --noEmit --allowJs 2>&1 | fold -sw 74
Natija
src/dokon.js(14,22): error TS2345: Argument of type 'string' is not
assignable to parameter of type 'number'.

Fayl hali ham oddiy JavaScript - uni hech qanday qurish vositasisiz ishga tushirish mumkin. Lekin tekshiruv .ts faylidagidek ishlaydi.

JavaScript
// @ts-check

/**
 * @typedef {object} Mahsulot
 * @property {string} nomi
 * @property {number} narx
 */

/** @type {string[]} */
const mahsulotlar = [];
mahsulotlar.push("Olma");
mahsulotlar.push(42);

/** @type {Mahsulot} */
const m = { nomi: "Olma" };
Terminal
tsc --noEmit --allowJs 2>&1 | fold -sw 74
Natija
src/turlar.js(12,18): error TS2345: Argument of type 'number' is not
assignable to parameter of type 'string'.
src/turlar.js(15,7): error TS2741: Property 'narx' is missing in type '{
nomi: string; }' but required in type 'Mahsulot'.

To'g'ri yozilganda hammasi jim:

JavaScript
// @ts-check

/**
 * @typedef {object} Mahsulot
 * @property {string} nomi
 * @property {number} narx
 */

/** @type {Mahsulot[]} */
const mahsulotlar = [
  { nomi: "Olma", narx: 12000 },
  { nomi: "Anor", narx: 25000 },
];

const jami = mahsulotlar.reduce((a, m) => a + m.narx, 0);
console.log(mahsulotlar.length, jami);
Terminal
tsc --noEmit --allowJs && echo "tsc: xato yo_q"
tsx src/turlar.js
Natija
tsc: xato yo_q
2 37000
JSDocTypeScript dagi mos keluvchisi
@param {number} narxnarx: number
@returns {number}: number
@type {string[]}const x: string[]
@typedef {object} M + @propertytype M = {...}
@template T<T>
Ko'chirish yo'li: har bir qadam mustaqil 0. Boshlanish Faqat .js tekshiruv yo'q xato: 0 ko'rinadi Aslida esa NaN oqib yuradi 1. allowJs tsconfig qo'shiladi checkJs: false hech narsa buzilmaydi Tahrirlovchi maslahat bera boshlaydi 2. @ts-check Fayl-fayl yoqiladi JSDoc yoziladi fayl .js bo'lib qoladi Qurish vositasi o'zgartirilmaydi 3. .ts ga o'tish Fayl qayta nomlanadi JSDoc turlarga ko'chadi noImplicitAny: false Bargdan ildizga qarab ko'chiring 4. strict Bayroqlar birma-bir yoqiladi eng oxirida noImplicitAny strictNullChecks Har bir qadamdan keyin loyiha ishlaydi va qo'shib qo'yiladi - "katta ko'chirish" kerak emas.
Beshta qadam, har biri alohida qo'shib qo'yiladi

@ts-ignore va @ts-expect-error #

Ko'chirish paytida ba'zi xatolarni vaqtincha o'chirishga to'g'ri keladi. Ikkita yo'l bor va ular bir xil emas:

TS
// @ts-ignore
const a: number = "Olma";
console.log(a, typeof a);
Terminal
tsc --noEmit && echo "tsc: xato yo_q"
tsx src/ignore.ts
Natija
tsc: xato yo_q
Olma string

a ning turi number deb e'lon qilingan, ichida esa satr. @ts-ignore xatoni butunlay yashirdi.

@ts-expect-error esa o'zini kuzatib turadi:

TS
// @ts-expect-error
const a: number = "Olma";

// @ts-expect-error
const b: number = 25000;

console.log(a, b);
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
src/expect.ts(4,1): error TS2578: Unused '@ts-expect-error' directive.

Birinchisi ishladi - xato bor edi va u yashirildi. Ikkinchisi esa o'zi xato berdi: kutilgan xato yo'q ekan.

Bu juda muhim farq: kod tuzalgach, @ts-expect-error o'zining keraksizligini aytadi. @ts-ignore esa abadiy qolib ketadi.

Doim @ts-expect-error yozing

@ts-ignore ning yagona afzalligi yo'q. Uning zarari esa aniq: bir yildan keyin hech kim o'sha qatorda muammo bor yoki yo'qligini bilmaydi.

Har bir chetlab o'tishga izoh ham qo'shing:

Natija
// @ts-expect-error - eski API, #142 da tuzatiladi

ESLint ning ban-ts-comment qoidasi buni majburiy qila oladi.

.ts ga qayta nomlash #

TS
export function chegirma(narx, foiz) {
  return narx - (narx * foiz) / 100;
}

export const mahsulotlar = [];
Terminal
tsc --noEmit 2>&1 | fold -sw 74
Natija
src/dokon.ts(1,26): error TS7006: Parameter 'narx' implicitly has an
'any' type.
src/dokon.ts(1,32): error TS7006: Parameter 'foiz' implicitly has an
'any' type.

E'tibor bering: mahsulotlar = [] shikoyat qilmadi - bu 3-bobdagi rivojlanuvchi massiv turi. Xato u ishlatilganda chiqadi.

Xatolar juda ko'p bo'lsa, noImplicitAny ni vaqtincha o'chirish mumkin:

TS
export function chegirma(narx, foiz) {
  return narx - (narx * foiz) / 100;
}

export const mahsulotlar = [];
Terminal
tsc --noEmit --noImplicitAny false && echo "tsc: xato yo_q"
Natija
tsc: xato yo_q

Endi loyiha kompilyatsiya bo'ladi va siz turlarni asta-sekin qo'shasiz.

Qaysi fayldan boshlash kerak

Barglardan - hech narsani import qilmaydigan fayllardan. Ular odatda yordamchi funksiyalar, doimiylar va turlar.

Sabab: agar ildizdan boshlasangiz, har bir import qilingan modul any bo'lib keladi va tekshiruvdan foyda bo'lmaydi.

Bog'liqlik grafigini madge --circular yoki depcruise kabi vositalar chizib beradi.

Chiqish va incremental #

JavaScript
export const QQS = 12;
TS
import { QQS } from "./eski.js";
export const soliq: number = QQS;
Terminal
tsc --allowJs --outDir dist
echo "--- dist ---"
ls dist
Natija
--- dist ---
eski.js
yangi.js

.js va .ts fayllar birga o'girildi va bitta papkaga tushdi - aralash loyiha shu tarzda ishlaydi.

Katta loyihada har safar hammasini qayta qurish sekin:

TS
export const salom = "Salom";
Terminal
tsc --incremental --outDir dist
echo "--- fayllar ---"
ls dist
ls *.tsbuildinfo
Natija
--- fayllar ---
asosiy.js
tsconfig.tsbuildinfo

tsconfig.tsbuildinfo - o'tgan qurish haqidagi ma'lumot. Keyingi safar faqat o'zgargan fayllar qayta ishlanadi.

Bu faylni .gitignore ga qo'shing.

Ko'chirish tartibi #

QadamNima qilinadiXatar
1tsconfig.json + allowJsYo'q
2Fayllarga // @ts-checkYo'q
3JSDoc turlariYo'q
4Bargdagi fayllarni .ts gaKam
5noImplicitAnyO'rtacha
6strictNullChecksKatta
7Qolgan strict bayroqlariKam

Beshinchi va oltinchi qadamlar eng ko'p mehnat talab qiladi. strictNullChecks odatda eng ko'p xato beradi - lekin eng ko'p foyda ham o'sha yerdan keladi.

Xulosa #

  • Ko'chirish bosqichma-bosqich qilinadi; har bir qadamdan keyin loyiha ishlaydi.
  • allowJs .js fayllarni qo'shadi, checkJs ularni tekshiradi.
  • // @ts-check bitta faylni yoqadi, // @ts-nocheck bitta faylni chetlab o'tadi.
  • JSDoc (@param, @returns, @type, @typedef) .js faylda to'liq turlash imkonini beradi.
  • JSDoc bilan turlangan fayl hali ham oddiy JavaScript - qurish vositasini o'zgartirish shart emas.
  • @ts-ignore xatoni abadiy yashiradi; @ts-expect-error keraksiz bo'lib qolganda TS2578 beradi.
  • Har bir chetlab o'tishga sabab va tuzatish rejasi yozilgan izoh qo'shing.
  • .ts ga o'tishda birinchi to'lqin odatda TS7006 bo'ladi; noImplicitAny: false bilan vaqt yutish mumkin.
  • Barglardan ildizga qarab ko'chiring, aks holda import qilinganlar any bo'lib keladi.
  • allowJs bilan .js va .ts fayllar birga o'girilib, bitta outDir ga tushadi.
  • --incremental va tsconfig.tsbuildinfo takroriy qurishni tezlashtiradi; bu faylni git ga qo'shmang.
  • Eng qiyin qadam - strictNullChecks, lekin eng foydalisi ham o'sha.
Amaliy topshiriq
  1. Ikkita .js faylli kichik loyiha yarating va NaN beradigan xato qoldiring.
  2. --allowJs bilan kompilyatsiya qiling - xato yo'qligini ko'ring.
  3. --checkJs qo'shib, TS7006 larni oling.
  4. Faqat bitta faylga // @ts-check yozib, farqni kuzating.
  5. JSDoc bilan parametrlarni turlang va noto'g'ri argument berib ko'ring.
  6. @typedef bilan obyekt turi yarating.
  7. @ts-ignore bilan xatoni yashirib, dasturni yiqiting.
  8. Uni @ts-expect-error ga almashtiring, keyin xatoni tuzatib TS2578 ni oling.
  9. Faylni .ts ga qayta nomlab, birinchi to'lqinni ko'ring.
  10. O'z loyihangiz uchun yettita qadamlik reja yozing va qaysi qadam eng ko'p vaqt olishini taxmin qiling.

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.