23 β Migratsiya: JS'dan TypeScript'ga¶
β¬ οΈ Oldingi: 22 β React va Node bilan TypeScript Β· π README Β· Keyingi: 24 β Yakuniy loyiha, best practices va shpargalka β‘οΈ
Bu bobda: mavjud, ishlab turgan katta JavaScript loyihasini noldan yozmasdan, asta-sekin TypeScript'ga ko'chirishni o'rganamiz:
allowJsvacheckJsbilan.jsva.tsni yonma-yon yashatish, fayllarni bittalab.tsga o'tkazish,anybilan tez boshlab keyin aniqlashtirish,@ts-expect-error(vaqtinchalik xato bostiruvchi ko'prik) va@ts-ignorefarqi,.tsga umuman o'tmasdan JSDoc izohlari bilan tip berish, tip yo'q tashqi kutubxonalarni shim qilish,strictni nega eng OXIRIDA yoqish kerakligi va butun migratsiya rejasini bosqichma-bosqich tuzib chiqishni ko'rib chiqamiz.
Muammo¶
Tasavvur qiling: kompaniyangizda 3 yildan beri yozilib kelayotgan katta JavaScript loyihasi bor β 400 ta .js fayl, har kuni ishlatiladi, mijozlar pul to'laydi. Jamoa "TypeScript'ga o'tamiz" deb qaror qildi. Lekin qanday?
Eng yomon yo'l β "dam olish kunlari hamma faylni .tsga aylantirib chiqaman" deyish. Dushanba kuni 8000 ta tip xatosi, ishlamaydigan loyiha va orqaga qaytib bo'lmaydigan ulkan pull request bilan uyg'onasiz. Hech kim uni ko'rib chiqolmaydi, hech narsa ishlamaydi, hamma TypeScript'dan nafratlanadi.
Yaxshi xabar: TypeScript aynan shu vaziyat uchun yaratilgan. Uni bir kunda emas, bir fayl-bir fayldan kiritish mumkin. Loyiha har bosqichda ishlab turadi. Bugun 5 ta fayl .ts, ertaga 10 ta, qolgan 390 tasi hali .js β va hammasi birga ishlab ketaveradi. Bu bobda aynan shu yo'lni o'rganamiz.
Eslatma: bu bob siz
tsconfig.jsonni (18-bob),any/unknownni (9-bob) vastrictoilasini bilasiz deb hisoblaydi. Agar JavaScript modullari (import/export) yodingizdan ko'tarilgan bo'lsa, JavaScript kitobiga qarang. Bu yerda biz ko'chirish jarayoniga e'tibor beramiz.
Oltin qoida: hech qachon hammasini birdan qilmang¶
Butun migratsiyaning asosida bitta tamoyil yotadi: har qadamda loyiha ishlab turishi kerak. TypeScript buni mumkin qiladi, chunki u JavaScript'ning ustki qatlami (superset) β har qanday to'g'ri .js kodi, aslida, to'g'ri TypeScript kodi hamdir. Demak fayllarni bittalab ko'chirsangiz, sinmaydi.
Strategiya to'rt bosqichdan iborat, har biri keyingisiga zamin tayyorlaydi:
allowJsyoqish β.jsva.tsbitta loyihada yonma-yon yashasin..js->.tsbittalab β tashqi chegaradan ichkariga qarab, har biri alohida kichik o'zgarish.any'ni aniqlashtirish β vaqtinchalikany'larni real tiplarga almashtirish.strictyoqish β eng OXIRIDA, to'liq tip xavfsizligi uchun.
Keling, har birini batafsil ko'rib chiqamiz.
1-bosqich: allowJs bilan aralash loyiha¶
TypeScript kompilyatori standart holda faqat .ts fayllarini ko'radi. Migratsiya boshlanishida bizga aksini xohlaymiz: u .js fayllarni ham "ko'rsin" va loyiha qurilsin. Buning kaliti β tsconfig.json'dagi allowJs:
{
"compilerOptions": {
"target": "es2020",
"module": "esnext",
"moduleResolution": "bundler",
"outDir": "dist",
"allowJs": true,
"strict": false
},
"include": ["src"]
}
π E'tibor bering: strict hozircha false. Bu ataylab. Migratsiyaning birinchi kunida strictni yoqish β o'zingizni minglab xato bilan ko'mish demak. strictni eng oxirida yoqamiz (4-bosqich). Hozir maqsad β quvurni ishga tushirish, qattiqqo'llik emas.
allowJs: true bilan tsc endi src ichidagi .js fayllarni ham oladi, ularni TypeScript orqali kompilyatsiya qiladi va distga chiqaradi. Loyihangiz xuddi avvalgidek ishlaydi β faqat endi build quvuringizda TypeScript turibdi.
π‘ tscni --noEmit bilan ishga tushirsangiz, u hech narsa chiqarmaydi β faqat tekshiradi. Bu CI (continuous integration β avtomatik tekshiruv konveyeri) uchun ideal: build vositangiz (Vite, esbuild, webpack) kodni o'zi quradi, tsc --noEmit esa faqat tip qo'riqchisi rolini o'ynaydi.
checkJs β .jsni ham tekshirishni so'rash¶
allowJs faqat .jsni kiritadi, lekin uni tekshirmaydi. Agar TypeScript .js fayllaringizdagi xatolarni ham aytib bersin desangiz, checkJsni yoqasiz:
β οΈ Ammo ehtiyot bo'ling: butun loyihaga checkJs: true qo'yish β 400 ta tekshirilmagan .js faylda birdaniga yuzlab xato chiqarishi mumkin. Migratsiya boshida ko'pincha bu juda erta. Yaxshiroq yo'l β checkJsni o'chiq qoldirib, faqat siz tayyor bo'lgan alohida fayllarga ularning birinchi qatoriga // @ts-check izohini qo'yish:
Bu faqat shu bitta .js faylni tekshiradi β qolganlariga tegmaydi. Teskari amal ham bor: checkJs: true umumiy yoqilgan bo'lsa, biror faylni vaqtincha tekshiruvdan chiqarish uchun uning boshiga // @ts-nocheck yozasiz.
2-bosqich: fayllarni bittalab .tsga ko'chirish¶
Quvur ishlagach, asosiy ish boshlanadi: .jsni .tsga aylantirish. Lekin tartibi muhim. Tashqi chegaradan ichkariga qarab harakatlaning:
- Avval "barg" modullar β hech narsaga bog'liq bo'lmagan, sof yordamchi funksiyalar (
utils,formatlash,validatsiya). Ularni tiplash oson va xatosi kam. - Keyin ma'lumot modellari va API qatlamlari β tashqi dunyo bilan chegara. Bu yerdagi tiplar eng ko'p foyda keltiradi.
- Eng oxirida chuqur ichki, hammaga bog'liq modullar.
Sababi sodda: agar barg modulni tiplab qo'ysangiz, undan foydalanadigan hamma fayl avtomatik foyda oladi. Aksincha, hammaga bog'liq markaziy faylni birinchi tiplasangiz, uning tiplari hali tiplanmagan modullarga tayanib turadi va anyga to'lib ketadi.
Bitta faylni ko'chirish β bu shunchaki:
salom.jsnisalom.tsdeb qayta nomlash.tsc --noEmitishga tushirib, chiqqan xatolarni o'qish.- Xatolarni tuzatish (yoki vaqtincha
anybilan yopish β keyingi bo'limga qarang). - Kichik pull request β bitta fayl, ko'rib chiqish oson.
π Bir nechta .js modullar bir-biriga halqa shaklida bog'langan (sirkulyar bog'liqlik) bo'lsa, ularni bitta PRda birga ko'chirish kerak bo'lishi mumkin. Lekin bunday holatlar kam β ko'pchilik fayllar mustaqil ko'chiriladi.
3-bosqich: any bilan boshlab, keyin aniqlashtirish¶
Faylni .ts qilganingizda TypeScript darrov shikoyat qiladi: parametrlarning tipi yo'q, obyektlar tanish emas va hokazo. Mana eng ko'p uchraydigan xato β noImplicitAny (strict ichida bor, lekin alohida ham yoqiladi):
// .js dan .ts ga endi ko'chirdik:
function salom(ism) {
// ^^^^
// β Xato: Parameter 'ism' implicitly has an 'any' type. (TS7006)
return "Salom, " + ism;
}
TypeScript "bu parametr tipini bilmayman" deyapti. Bu yerda ikki tanlovingiz bor.
To'g'ri yo'l (mumkin bo'lsa): tipni darrov aniq yozish.
function salom(ism: string): string {
return "Salom, " + ism;
}
console.log(salom("Ali")); // β
toza o'tadi
Tezkor yo'l (vaqt yo'q bo'lsa): any bilan vaqtincha yopish, keyin qaytib aniqlashtirish.
// 1-bosqich: tezda any (migratsiya tezligi uchun)
function foydalanuvchiniOl(id: any): any {
return { id, ism: "?" };
}
const u = foydalanuvchiniOl(5);
console.log(u.istalganNarsa); // any -> hamma narsaga ruxsat, tekshiruv yo'q
Bu kod toza o'tadi, chunki any hamma narsani qabul qiladi. Maqsad β faylni ishchi holatda .tsga ko'chirib qo'yish. Keyin, vaqt topganda, qaytib any'ni real tipga almashtirasiz:
// 2-bosqich: aniqlashtirilgan
interface Foydalanuvchi {
id: number;
ism: string;
}
function foydalanuvchiniOl(id: number): Foydalanuvchi {
return { id, ism: "?" };
}
const u = foydalanuvchiniOl(5);
console.log(u.ism.toUpperCase()); // β
endi ism aniq string
π‘ any'larni keyin oson topish uchun ularga belgi qo'ying: // TODO: any -> aniq tip. Ko'p jamoalar tscga maxsus reja sifatida "loyihada nechta any qoldi" deb hisoblab boradi β son qancha kam bo'lsa, migratsiya shuncha chuqur.
π any "yuqumli": any qiymat tekkan har bir ifoda ham anyga aylanib, tip xavfsizligini jimgina o'chiradi (buni 9-bobda ko'rgandik). Shuning uchun any β vaqtinchalik plomba, doimiy yechim emas. Tashqi, ishonchsiz ma'lumot uchun any o'rniga ko'pincha unknown xavfsizroq: u sizni ishlatishdan oldin tekshirishga majbur qiladi.
@ts-expect-error β vaqtinchalik xato ko'prigi¶
Ba'zan bitta qatorda xato bor, lekin uni hozir tuzatishga vaqtingiz yo'q (masalan, u boshqa hali ko'chirilmagan modulga tayanadi). Shu bitta qatorni vaqtincha "kechirtirib" turishingiz mumkin:
function eskiHisobla(): string {
return "100";
}
// @ts-expect-error TODO: eskiHisobla() string qaytaradi, keyin to'g'rilaymiz
const summa: number = eskiHisobla();
console.log(summa);
Bu toza o'tadi, garchi stringni numberga berish odatda xato bo'lsa-da. @ts-expect-error keyingi qatordagi xatoni bostiradi.
Ammo @ts-expect-errorning sehri shunda: u xato bo'lishini KUTADI. Agar siz eskiHisoblani keyin number qaytaradigan qilib tuzatsangiz, keyingi qatorda endi xato bo'lmaydi β va @ts-expect-error o'zi xato beradi:
Bu β sovg'a. TypeScript sizga "bu vaqtinchalik plomba endi keraksiz, uni olib tashla" deb eslatadi. Shu tarzda eski, unutilgan bostiruvchilar kodda chirib qolmaydi.
β Aksincha, eski @ts-ignore jimgina bostiradi va xato yo'qolsa ham indamaydi:
function eskiHisobla(): number {
return 100;
}
// @ts-ignore <- xato allaqachon yo'q, lekin @ts-ignore baribir jim turadi
const summa: number = eskiHisobla();
console.log(summa);
Bu kod ham o'tadi, lekin @ts-ignore endi keraksiz β va hech kim buni aytmaydi. Yillar o'tib bu izohlar kodda to'planib, "nega bu yerda?" degan jumboqqa aylanadi.
π‘ Qoida: migratsiyada doim @ts-expect-errorni afzal ko'ring, @ts-ignoreni emas. Va har biriga sabab yozing: // @ts-expect-error <sabab + TODO>. Sababsiz bostiruvchi β kelajakdagi muammo.
JSDoc bilan tip berish β .tsga o'tmasdan¶
Ba'zan faylni .tsga aylantirib bo'lmaydi: ehtimol build quvuringiz hali TypeScriptni qura olmaydi, yoki shu faylni darrov o'zgartirishga ruxsat yo'q. Bunday holatda ham TypeScriptning tekshiruvidan foydalanish mumkin β kodni .js holida qoldirib, tiplarni izoh (JSDoc) sifatida yozasiz.
checkJs (yoki fayl boshida // @ts-check) yoqilgan bo'lsa, TypeScript bu izohlardagi tiplarni o'qiydi va tekshiradi:
/**
* @param {number} a
* @param {number} b
* @returns {number}
*/
function qoshish(a, b) {
return a + b;
}
/** @type {string} */
let ism = "Oqil";
qoshish(2, 3); // β
to'g'ri
ism = "Ali"; // β
string
Bu oddiy JavaScript β brauzer yoki Node uni hech qanday qadamsiz ishlatadi, chunki tiplar shunchaki izoh. Ammo checkJs ostida TypeScript ularni jiddiy qabul qiladi va xatoni ushlaydi:
/**
* @param {number} a
* @param {number} b
* @returns {number}
*/
function qoshish(a, b) {
return a + b;
}
qoshish("ikki", 3);
// ^^^^^^
// β Xato: Argument of type 'string' is not assignable
// to parameter of type 'number'. (TS2345)
Obyekt shakllarini ham JSDoc bilan e'lon qilish mumkin β @typedef orqali, xuddi interface kabi:
/**
* @typedef {Object} Kitob
* @property {string} nomi
* @property {number} yil
*/
/** @type {Kitob} */
const k = { nomi: "O'tkan kunlar", yil: 1925 };
/**
* @param {Kitob} kitob
* @returns {string}
*/
function tavsif(kitob) {
return kitob.nomi + " (" + kitob.yil + ")";
}
console.log(tavsif(k)); // β
toza o'tadi
Agar yilga noto'g'ri tip bersangiz, TypeScript ushlaydi:
/** @type {Kitob} */
const k = { nomi: "O'tkan kunlar", yil: "1925" };
// ^^^^^^
// β Xato: Type 'string' is not assignable to type 'number'. (TS2322)
π‘ JSDoc β migratsiyaning eng yumshoq qadami: hech bir faylni qayta nomlamasdan, build quvurini o'zgartirmasdan tip xavfsizligini sinab ko'rasiz. Lekin u so'zamol (verbose) β har tip uchun ko'p qator izoh kerak. Shuning uchun jiddiy loyihada pirovardida .tsga o'tiladi; JSDoc esa o'tish davrida yoki .tsga umuman o'ta olmaydigan fayllar uchun qoladi.
Tashqi kutubxonalarda tip yo'q bo'lsa¶
Migratsiyaning eng tez-tez uchraydigan to'sig'i β import qildim, lekin tip topilmadi xatosi. Ko'p paket o'z tiplarini olib keladi, ba'zilarida tip @types/... paketida bo'ladi (21-bob), lekin eski yoki kichik paketlarda umuman tip bo'lmasligi mumkin:
Bu yerda bir necha yo'l bor. Eng tezi β paket uchun mini deklaratsiya fayli yozish. Loyihada types/eski-paket.d.ts yarating va faqat o'zingizga kerak qismini e'lon qiling:
// types/eski-paket.d.ts
declare module "eski-paket" {
export function pul(summa: number): string;
}
Endi import { pul } from "eski-paket" ishlaydi va pul aniq tipga ega bo'ladi. Butun paketni tiplash shart emas β faqat ishlatadigan funksiyangizni.
π Eng dangasa, eng xavfli yo'l β butun modulni any deb e'lon qilish:
Bu xatoni o'chiradi, lekin paketdan kelgan hamma narsa any bo'ladi β tip xavfsizligi yo'q. Vaqtinchalik plomba sifatida o'tadi, lekin imkon topib yuqoridagidek aniq imzo yozgan ma'qul.
π‘ tsconfig.json'da "skipLibCheck": true ham foydali: u tashqi .d.ts fayllarning ichini tekshirmaydi, faqat sizning kodingizni tekshiradi. Migratsiyada bu ko'p begona xatoni kamaytiradi va build'ni tezlatadi.
4-bosqich: strictni eng OXIRIDA yoqish¶
Hamma fayl .ts bo'lgach, any'lar kamaygach, oxirgi qadam β strictni yoqish. Nega oxirida? Chunki strict bitta katta tugma emas β u bir nechta qattiqqo'l tekshiruvni yoqadi (strictNullChecks, noImplicitAny, strictFunctionTypes va boshqalar β 18-bobda ko'rgandik). Loyiha boshida buni yoqsangiz, hamma flag birdan minglab xato beradi.
Eng ko'p og'riq keltiradigani β strictNullChecks. U yoqilmaganda null jim turadi; yoqilgach esa har bir potensial nullni ushlashga majbur bo'lasiz:
function topUzunlik(matn: string | null): number {
return matn.length;
// ^^^^
// β Xato: 'matn' is possibly 'null'. (TS18047)
}
Tuzatish β nullni ushlash:
function topUzunlik(matn: string | null): number {
if (matn === null) return 0; // null'ni ushlab oldik
return matn.length; // β
endi matn aniq string
}
console.log(topUzunlik("salom")); // 5
console.log(topUzunlik(null)); // 0
Bunday joylar minglab bo'lsa, hammasini birdan tuzatib bo'lmaydi. Shuning uchun flagma-flag yondashuv afzal: strict: true deb birvarakayiga yoqish o'rniga, qattiqqo'l flaglarni bittalab yoqasiz va har birini alohida tuzatib chiqasiz:
{
"compilerOptions": {
"noImplicitAny": true,
"strictNullChecks": false,
"strictFunctionTypes": false
}
}
Avval noImplicitAnyni yoqib, hamma implicit any'ni tozalaysiz. Keyin alohida PRda strictNullChecks: truega o'tasiz. Oxirida hammasini birga "strict": true bilan almashtirasiz β bu nuqtada loyiha allaqachon hamma tekshiruvdan o'tib bo'lgan bo'ladi.
π‘ Har flagni yoqqaningizda tsc --noEmit xatolar sonini ko'rsatadi. Bu β yaxshi progress o'lchovi: xato 0 ga yetganda, flag tugadi, keyingisiga o'tasiz.
Hamma narsani birga: migratsiya rejasi¶
Endi yuqoridagilarni bitta amaliy rejaga yig'amiz. Real loyihada migratsiya taxminan shunday kechadi:
0. TAYYORGARLIK
- tsconfig.json yaratish: allowJs: true, strict: false, noEmit: true
- CI'ga `tsc --noEmit` qadamini qo'shish (build'ni buzmasdan, faqat ogohlantirish)
1. CHEGARANI TIPLASH
- API javoblari, ma'lumot modellari uchun interface'lar yozish
- Eng ko'p ishlatiladigan barg modullarni .ts ga ko'chirish
- Tip yo'q paketlarga types/*.d.ts shim yozish
2. ICHKARIGA HARAKAT
- Modullarni bittalab .ts ga ko'chirish (har biri alohida PR)
- Qiyin joylarni vaqtincha any yoki @ts-expect-error bilan yopish
- Har any/expect-error ga TODO va sabab yozish
3. ANY'NI KAMAYTIRISH
- "loyihada nechta any qoldi" ni hisoblab borish
- TODO'larni bittalab yopib, any -> aniq tip
4. STRICT'GA O'TISH
- noImplicitAny yoqish, tozalash
- strictNullChecks yoqish, tozalash
- qolgan strict flaglar
- oxirida "strict": true
5. CI'NI MAJBURIY QILISH
- `tsc --noEmit` xatosi build'ni TO'XTATADIGAN qilish
- shundan keyin yangi xato kira olmaydi
π 5-qadam β eng muhimi. tsc --noEmit CI'da faqat ogohlantirish bo'lib turguncha, jamoa uni e'tiborsiz qoldiradi va yangi any'lar oqib kiraveradi. Migratsiya yetarlicha ilgarilagach, tscni majburiy qiling: tip xatosi bo'lsa, PR merge bo'lmasin. Shundagina TypeScript haqiqiy qo'riqchiga aylanadi.
π‘ Migratsiya bir vaqtning o'zida to'liq tugashi shart emas. Ko'p muvaffaqiyatli loyihalar yillar davomida "90% TypeScript, 10% qolgan .js" holatida bemalol yashaydi. Muhimi β yangi kod doim .tsda yozilsin va tsc CI'da majburiy bo'lsin. Qolgani β vaqt masalasi.
Endi sizda mavjud JavaScript loyihasini sindirmasdan TypeScript'ga ko'chirishning to'liq xaritasi bor: allowJs bilan boshlash, fayllarni chegaradan ichkariga bittalab .tsga ko'chirish, any va @ts-expect-error bilan vaqtincha yopib keyin aniqlashtirish, .tsga o'ta olmaganda JSDoc'dan foydalanish, tip yo'q paketlarni shim qilish va strictni eng oxirida, flagma-flag yoqish. Asosiy tamoyilni unutmang: har qadamda loyiha ishlab tursin, hech qachon hammasini birdan qilmang. Keyingi β yakuniy bobda hamma o'rganganlarimizni bitta to'liq loyihada birlashtirib, best practices va shpargalka bilan kitobni yakunlaymiz.
23-bob mashqlari¶
Quyidagi mashqlarni o'zingiz bajaring. Har birini tsc bilan tekshiring β toza misollar xatosiz o'tsin, ataylab xatolilar TypeScript ogohlantirishi bilan chiqsin. Mashqlar uchun ataylab tiplanmagan kichik .js loyihasi tuzib oling (2-3 fayl yetarli). (Yechimlar berilmagan β maqsad o'zingiz yozib o'rganish.)
-
Yangi papkada
tsconfig.jsonyarating:allowJs: true,strict: false,noEmit: true. Ichiga bittasalom.jsqo'yib,tsc --noEmitishlaganini tekshiring (xato bo'lmasligi kerak). -
checkJsni umumiy yoqmasdan, faqatsalom.jsning birinchi qatoriga// @ts-checkqo'shing. Funksiya parametriga noto'g'ri tipdagi qiymat bering vatscxato berishini ko'ring. -
salom.jsnisalom.tsdeb qayta nomlang.tsc --noEmitishga tushiring va chiqqanimplicitly has an 'any' type(TS7006) xatosini o'qing. -
Shu 3-mashqdagi parametrga aniq tip (
string) yozib, xatoni yo'qoting va misol toza o'tishiga erishing. -
Bitta funksiya yozing: parametri va qaytish tipi
anybo'lsin. Uning ichidaparam.istalganNarsani chaqiring βanybo'lgani uchun xato bo'lmasligini ko'ring. -
5-mashqdagi
any'ni aniqinterfacega almashtiring. Endiparam.istalganNarsaga murojaat qilsangiz xato chiqishini ko'ring va to'g'ri xossaga o'ting. -
stringqaytaradigan funksiya yozing, natijasininumbertipidagi o'zgaruvchiga bering. Chiqqan xatoni@ts-expect-errorbilan bostiring va misol toza o'tishiga erishing. -
7-mashqdagi funksiyani
numberqaytaradigan qilib tuzating. Endi@ts-expect-error"Unused directive" (TS2578) xatosi berishini ko'ring va izohni olib tashlang. -
Bir xil xatoli qatorni bir marta
@ts-ignore, bir marta@ts-expect-errorbilan yoping. Keyin xatoni tuzatib, ikkalasi qanday farqli javob berishini taqqoslang. -
.jsfaylda JSDoc bilan tiplangan funksiya yozing:@param {number}va@returns {number}.// @ts-checkbilan tekshiring β noto'g'ri argument bersangiz xato chiqishini ko'ring. -
JSDoc
@typedefbilan obyekt tipini ({ nomi: string, yil: number }) e'lon qiling va undan@typeorqali foydalaning.yilga string bersangiz xato chiqishini ko'ring. -
JSDoc bilan tiplangan
.jsfaylnitsc'siz oddiy Node yoki brauzerda ishga tushiring β tiplar izoh bo'lgani uchun kod o'zgarishsiz ishlashiga ishonch hosil qiling. -
Tip yo'q soxta paket uchun
types/mojiza.d.tsyarating:declare module "mojiza"ichida bitta funksiya imzosini e'lon qiling. Uni import qilib ishlatib ko'ring. -
13-mashqdagi shimga noto'g'ri argument bersangiz, deklaratsiyadagi tip uni ushlashini tekshiring.
-
Butun modulni
declare module "mojiza";deb (imzosiz) e'lon qiling. Endi undan kelgan hamma narsaanybo'lishini va tekshiruv yo'qolishini kuzating β nega bu xavfli ekanini bir jumlada yozing. -
tsconfig.json'da faqatnoImplicitAny: trueyoqing (qolgan strict flaglarfalse). Tiplanmagan parametrli funksiya yozib, faqat shu flag xato berishini ko'ring. -
Endi
strictNullChecks: trueham yoqing.string | nullparametrli funksiyada.lengthchaqiring vapossibly 'null'(TS18047) xatosini ko'ring, so'ngifbilan tuzating. -
strict: truega o'ting. Avvalgi misollaringiz hammasi toza o'tishini tekshiring β agar yangi xato chiqsa, qaysi flag sababini aniqlang. -
Kichik (5-6 fayllik) soxta
.jsloyiha tasavvur qiling. Qaysi fayldan ko'chirishni boshlashingizni va tartibini (barg -> model -> markaziy) yozma rejaga tushiring. Har fayl uchun "any bilanmi yoki darrov aniq tip" qarorini belgilang. -
O'z loyihangiz (yoki tasavvuriy loyiha) uchun to'liq migratsiya rejasini yozing: 0-5 bosqichlar, har bosqichda nima qilinishi,
tsc --noEmitCI'da qachon ogohlantirishdan majburiyga o'tishi. RejaniMIGRATION.mdshaklida hujjatlashtiring.