18-bo‘lim
JS loyihasini ko'chirish
allowJs va checkJs, JSDoc bilan turlash, @ts-check, @ts-expect-error va bosqichma-bosqich qat'iylashtirish.
Ushbu bo‘lim mundarijasi
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 #
export function chegirma(narx, foiz) {
return narx - (narx * foiz) / 100;
}
import { chegirma } from "./dokon.js";
console.log(chegirma(50000, 20));
console.log(chegirma(50000));
tsx src/asosiy.js
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 #
export function chegirma(narx, foiz) {
return narx - (narx * foiz) / 100;
}
import { chegirma } from "./dokon.js";
console.log(chegirma(50000, 20));
console.log(chegirma(50000));
echo "--- faqat allowJs ---"
tsc --noEmit --allowJs && echo "xato yo_q"
echo "--- allowJs va checkJs ---"
tsc --noEmit --allowJs --checkJs 2>&1 | fold -sw 74
--- 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.
| Sozlama | Nima qiladi |
|---|---|
allowJs | .js fayllarni loyihaga qo'shadi |
checkJs | Ularni ham tekshiradi |
Katta loyihada checkJs ni birdan yoqish yuzlab xato beradi.
Shuning uchun fayl-fayl yoqish mumkin:
export function qqs(narx) {
return narx * 1.12;
}
console.log(qqs());
// @ts-check
export function chegirma(narx, foiz) {
return narx - (narx * foiz) / 100;
}
console.log(chegirma(50000));
tsc --noEmit --allowJs 2>&1 | fold -sw 74
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.
checkJs: true yoqilgan bo'lsa, ayrim fayllarni chetlab
o'tish uchun ular boshiga // @ts-nocheck yoziladi.
Amaliy strategiya:
allowJs: true,checkJs: false- hech narsa buzilmaydi;- fayllarga birma-bir
// @ts-checkqo'shib, tuzatib chiqiladi; - ko'pchiligi tuzalgach,
checkJs: trueqilinadi va qolganlariga// @ts-nocheckqo'yiladi; // @ts-nochecklar asta-sekin olib tashlanadi.
Har bir qadam mustaqil va qaytariladigan.
JSDoc bilan turlash #
.js faylda ham to'liq turlash mumkin - izohlar orqali:
// @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));
tsc --noEmit --allowJs 2>&1 | fold -sw 74
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.
// @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" };
tsc --noEmit --allowJs 2>&1 | fold -sw 74
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:
// @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);
tsc --noEmit --allowJs && echo "tsc: xato yo_q"
tsx src/turlar.js
tsc: xato yo_q
2 37000
| JSDoc | TypeScript dagi mos keluvchisi |
|---|---|
@param {number} narx | narx: number |
@returns {number} | : number |
@type {string[]} | const x: string[] |
@typedef {object} M + @property | type M = {...} |
@template T | <T> |
@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-ignore
const a: number = "Olma";
console.log(a, typeof a);
tsc --noEmit && echo "tsc: xato yo_q"
tsx src/ignore.ts
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-expect-error
const a: number = "Olma";
// @ts-expect-error
const b: number = 25000;
console.log(a, b);
tsc --noEmit 2>&1 | fold -sw 74
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.
@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:
// @ts-expect-error - eski API, #142 da tuzatiladi
ESLint ning ban-ts-comment qoidasi buni majburiy qila
oladi.
.ts ga qayta nomlash #
export function chegirma(narx, foiz) {
return narx - (narx * foiz) / 100;
}
export const mahsulotlar = [];
tsc --noEmit 2>&1 | fold -sw 74
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:
export function chegirma(narx, foiz) {
return narx - (narx * foiz) / 100;
}
export const mahsulotlar = [];
tsc --noEmit --noImplicitAny false && echo "tsc: xato yo_q"
tsc: xato yo_q
Endi loyiha kompilyatsiya bo'ladi va siz turlarni asta-sekin qo'shasiz.
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 #
export const QQS = 12;
import { QQS } from "./eski.js";
export const soliq: number = QQS;
tsc --allowJs --outDir dist
echo "--- dist ---"
ls dist
--- 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:
export const salom = "Salom";
tsc --incremental --outDir dist
echo "--- fayllar ---"
ls dist
ls *.tsbuildinfo
--- 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 #
| Qadam | Nima qilinadi | Xatar |
|---|---|---|
| 1 | tsconfig.json + allowJs | Yo'q |
| 2 | Fayllarga // @ts-check | Yo'q |
| 3 | JSDoc turlari | Yo'q |
| 4 | Bargdagi fayllarni .ts ga | Kam |
| 5 | noImplicitAny | O'rtacha |
| 6 | strictNullChecks | Katta |
| 7 | Qolgan strict bayroqlari | Kam |
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.jsfayllarni qo'shadi,checkJsularni tekshiradi.// @ts-checkbitta faylni yoqadi,// @ts-nocheckbitta faylni chetlab o'tadi.- JSDoc (
@param,@returns,@type,@typedef).jsfaylda to'liq turlash imkonini beradi. - JSDoc bilan turlangan fayl hali ham oddiy JavaScript - qurish vositasini o'zgartirish shart emas.
@ts-ignorexatoni abadiy yashiradi;@ts-expect-errorkeraksiz bo'lib qolgandaTS2578beradi.- Har bir chetlab o'tishga sabab va tuzatish rejasi yozilgan izoh qo'shing.
.tsga o'tishda birinchi to'lqin odatdaTS7006bo'ladi;noImplicitAny: falsebilan vaqt yutish mumkin.- Barglardan ildizga qarab ko'chiring, aks holda import
qilinganlar
anybo'lib keladi. allowJsbilan.jsva.tsfayllar birga o'girilib, bittaoutDirga tushadi.--incrementalvatsconfig.tsbuildinfotakroriy qurishni tezlashtiradi; bu faylni git ga qo'shmang.- Eng qiyin qadam -
strictNullChecks, lekin eng foydalisi ham o'sha.
- Ikkita
.jsfaylli kichik loyiha yarating vaNaNberadigan xato qoldiring. --allowJsbilan kompilyatsiya qiling - xato yo'qligini ko'ring.--checkJsqo'shib,TS7006larni oling.- Faqat bitta faylga
// @ts-checkyozib, farqni kuzating. - JSDoc bilan parametrlarni turlang va noto'g'ri argument berib ko'ring.
@typedefbilan obyekt turi yarating.@ts-ignorebilan xatoni yashirib, dasturni yiqiting.- Uni
@ts-expect-errorga almashtiring, keyin xatoni tuzatibTS2578ni oling. - Faylni
.tsga qayta nomlab, birinchi to'lqinni ko'ring. - O'z loyihangiz uchun yettita qadamlik reja yozing va qaysi qadam eng ko'p vaqt olishini taxmin qiling.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.