18 β tsconfig.json chuqur¶
β¬ οΈ Oldingi: 17 β Modullar va deklaratsiya fayllari (.d.ts) Β· π README Β· Keyingi: 19 β DOM va brauzer TypeScript bilan β‘οΈ
Bu bobda: kompilyatorning xulqini boshqaradigan
tsconfig.jsonfaylini ichidan o'rganamiz. Uning uch asosiy bloki (compilerOptions,include,exclude), eng muhim flaglar (strictva u yoqadigan butun oila,target,module,lib,outDir/rootDir,esModuleInterop,skipLibCheck,pathsalias,sourceMap,declaration,noEmit), nega aynanstrictNullChecks"o'yin o'zgartiruvchi" ekanini ko'ramiz; oxirida har loyiha turi (Node, brauzer, kutubxona) uchun tavsiya etilgan boshlang'ich konfiguratsiya beramiz.
Muammo¶
2-bobda biz npx tsc --init bilan tsconfig.json yaratgan, ichidan bir nechta sozlamani ajratib olib ishlatgan edik. O'shandan beri 15 bob davomida tiplarni o'rgandik β lekin har doim bir savol ortda turardi: "TypeScript bu kodni xato deb belgilashi yoki belgilamasligini aslida kim hal qiladi?"
Javob β tsconfig.json. Bitta sozlamani o'zgartirsangiz, bir xil kod bir loyihada toza compile bo'ladi, boshqasida xato beradi. Mana real misol:
Bu kod xatomi? Bog'liq. Agar strictNullChecks yoqilgan bo'lsa β ha, chunki matn null bo'lishi mumkin, null[0] esa dasturni "yiqitadi". Agar o'sha flag o'chiq bo'lsa β TypeScript bu kodni jimgina o'tkazib yuboradi va xato faqat foydalanuvchi null bergan paytda, dastur ishlab turganda chiqadi.
Demak tsconfig.json β shunchaki "yo'l-yo'riq fayl" emas: u sizning loyihangiz qanchalik xavfsiz ekanini belgilaydi. Bu bobda har bir muhim "rubilnik"ni β nima qilishini, nega kerakligini va qachon o'zgartirishni β birma-bir ko'rib chiqamiz. Avval umumiy tuzilishdan boshlaymiz.
tsconfig.json uch blokdan iborat¶
Loyiha ildizidagi tsconfig.json β bu oddiy JSON fayl. Uning yuragida uchta narsa turadi:
{
"compilerOptions": {
"target": "es2022",
"strict": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Uchta blokning vazifasi sodda:
compilerOptionsβ eng katta va eng muhim blok. Kod qanday tekshirilishi (strict...) va qanday JavaScript chiqishi (target,module,outDir...) shu yerda belgilanadi. Bob qolganining ko'p qismi shu blok haqida.includeβ qaysi fayllar compile qilinadi.["src/**/*"]βsrcpapkasi ichidagi (ichkaridagi papkalar bilan birga) hamma.tsfayl.**belgisi "papkalar ichkarisigacha kir" degani.excludeβincludetanlaganidan nimani olib tashlash. Odatdanode_modules(boshqalarning kodi) vadist(compile natijasi) bu yerda turadi.
π include yozmasangiz nima bo'ladi? TypeScript tsconfig.json turgan papkadan boshlab hamma .ts faylni oladi β node_modules ichidagisini ham. Aynan shuning uchun excludeda node_modules deyarli doim turadi. Lekin includeni aniq yozish (["src/**/*"]) eng tartibli yo'l: kompilyator faqat sizning kodingiz bilan ishlaydi, tezroq bo'ladi va kutilmagan fayllar tekshiruvga tushmaydi.
π‘ compilerOptionsdan tashqari yana ikki "umumiy" sozlama bor: files (faqat sanab o'tilgan aniq fayllar β kichik loyihada) va extends (boshqa tsconfig'dan meros olish β masalan "extends": "@tsconfig/node22/tsconfig.json"). Katta loyihalarda extends orqali tayyor, sinalgan asosni olib, ustiga o'zingiznikini qo'shasiz.
strict β eng muhim bitta flag¶
tsconfig.jsonda yozadigan birinchi va eng muhim qatoringiz shu:
strict β bu bitta sozlama emas, balki butun bir oilaning umumiy rubilnigi. Uni true qilsangiz, quyidagilarning hammasi birvarakayiga yonadi:
noImplicitAnyβ tipi yozilmagan, TypeScript ham topa olmaydigan o'zgaruvchi/parametranybo'lib qolishini ta'qiqlaydi (9-bobdagi "yashirinany").strictNullChecksβnullvaundefinedni alohida, jiddiy tip sifatida ko'radi (pastda batafsil).strictFunctionTypesβ funksiya tiplarini bir-biriga berishda parametrlarni qattiqroq solishtiradi.strictBindCallApplyβbind,call,applyargumentlarini tekshiradi.strictPropertyInitializationβ class maydonlari konstruktor ichida boshlanishini talab qiladi (13-bob).noImplicitThisβthisning tipi noaniq (any) bo'lib qolsa, xato beradi.useUnknownInCatchVariablesβcatch (e)dagienianyemas,unknownqiladi (9-bob β xavfsizroq).alwaysStrictβ chiqarilgan.jsfaylga"use strict"qo'shadi.
π Nega bittalab emas, hammasini birga? Chunki bu sakkiztasi birgalikda "TypeScript kuchi"ni tashkil qiladi. Bittasini o'chirib qo'yish β devordan bitta g'isht olib tashlashga o'xshaydi: tirqish paydo bo'ladi va aynan o'sha tirqishdan xato o'tib ketadi. Shuning uchun zamonaviy maslahat oddiy: doim "strict": true.
π‘ Eski loyihada birdan strict yoqsangiz yuzlab xato chiqishi mumkin β bu 23-bobdagi migratsiya mavzusi. Yangi loyihada esa boshidanoq yoqing: keyin qo'shilgan har bir qator allaqachon "to'g'ri" yoziladi.
Endi strict ichidagi ikki eng muhim a'zoni β noImplicitAny va strictNullChecksni β alohida, kod bilan ko'ramiz.
noImplicitAny β tipsiz parametrga yo'l yo'q¶
Quyidagi funksiyada son parametrining tipi yozilmagan, TypeScript uni hech qayerdan topa olmaydi:
function ikkilantir(son) { // β Xato: son uchun tip yo'q
return son * 2;
}
console.log(ikkilantir(21));
strict (demak noImplicitAny ham) yoqilgan bo'lsa:
Tarjimasi: "son parametri yashirincha any tipiga ega bo'lib qoldi". TypeScript shunday deydi: "men son nimaligini bilmayman, sen ham aytmading β bu any, lekin men anyni jimgina qabul qilmayman". Tuzatish β tipni ochiq yozish:
function ikkilantir(son: number): number { // β
endi toza
return son * 2;
}
console.log(ikkilantir(21));
π Diqqat: bu faqat TypeScript o'zi topa olmaydigan joylarga tegishli. const ismlar = ["Ali", "Vali"] da tipni yozmasangiz ham xato bo'lmaydi β chunki TypeScript uni qiymatdan o'qib string[] deb biladi (3-bobdagi inference). noImplicitAny faqat "haqiqatan ham noaniq" qolgan joylarni ushlaydi.
strictNullChecks β nega o'yin o'zgartiruvchi¶
Bu β strict oilasidagi eng muhim flag. U yoqilmagan bo'lsa, TypeScript null va undefinedni deyarli har qanday tipga "yashirincha kiritib yuboradi" β ya'ni string deb e'lon qilingan o'zgaruvchiga null ham sig'averadi. Bu esa JavaScript'ning eng mashhur xatosiga ("Cannot read property of null") yo'l ochadi.
strictNullChecks yoqilgan bo'lsa, hamma narsa o'zgaradi. Bobning boshidagi muammoga qaytamiz:
function birinchiHarf(matn: string | null): string {
return matn[0]; // β Xato: matn null bo'lishi mumkin
}
TypeScript aytadi: "matn null bo'lishi mumkin β null[0] esa dasturni yiqitadi". Bu β bebaho ogohlantirish: xato foydalanuvchigacha emas, hali yozayotganingizda topildi. Tuzatish β 8-bobdagi narrowing bilan nullni ajratib olish:
function birinchiHarf(matn: string | null): string {
if (matn === null) {
return "(bo'sh)"; // null holatini alohida hal qildik
}
return matn[0]; // β
bu yerda matn aniq string
}
console.log(birinchiHarf("Toshkent"));
console.log(birinchiHarf(null));
Optional property bilan ham xuddi shu himoya ishlaydi:
interface Foydalanuvchi {
id: number;
ism: string;
telefon?: string; // bo'lishi shart emas -> string | undefined
}
function telefonKorsat(u: Foydalanuvchi): string {
if (u.telefon === undefined) {
return u.ism + ": telefon yo'q";
}
return u.ism + ": " + u.telefon; // β
bu yerda telefon aniq string
}
const a: Foydalanuvchi = { id: 1, ism: "Aziz" };
const b: Foydalanuvchi = { id: 2, ism: "Malika", telefon: "+998901234567" };
console.log(telefonKorsat(a));
console.log(telefonKorsat(b));
π Nega aynan "o'yin o'zgartiruvchi"? Chunki JavaScript dasturlarining juda katta qismi null/undefined bilan bog'liq xatolarda "yiqiladi". strictNullChecks butun bu sinf xatolarni compile vaqtida ushlab beradi. TypeScript yozishning eng katta sababi aynan shu β uni o'chirib qo'ysangiz, asbobning yarmini tashlab yuborgan bo'lasiz.
π‘ Yana bir keng tarqalgan flag bor (lekin strict ichida emas, alohida yoqiladi): noUncheckedIndexedAccess. U ismlar[0] natijasini string emas, string | undefined qiladi β chunki massivda bunday indeks bo'lmasligi ham mumkin. Juda foydali, ammo qattiq; uni keyinroq, qulay bo'lganda qo'shasiz.
strictFunctionTypes β funksiyalarni qattiqroq solishtirish¶
Bu flag ham strict ichida. U funksiya tipini boshqa funksiya tipiga berganda parametrlarni qattiq tekshiradi:
type Tekshiruvchi = (x: string | number) => boolean;
const faqatString = (x: string): boolean => x.length > 0;
const t: Tekshiruvchi = faqatString; // β Xato
error TS2322: Type '(x: string) => boolean' is not assignable to type 'Tekshiruvchi'.
Types of parameters 'x' and 'x' are incompatible.
Type 'string | number' is not assignable to type 'string'.
Mantiq: Tekshiruvchi o'rniga turadigan funksiya string ham, number ham qabul qila olishi kerak. faqatString esa faqat string oladi β agar kimdir unga number bersa, x.length qatorida yiqiladi. Shuning uchun TypeScript bu almashishni rad etadi. Flag o'chiq bo'lsa, bu xavfli kod jimgina o'tib ketardi.
target β qaysi JavaScript versiyasiga compile qilamiz¶
target TypeScript'ga "men kodni qanchalik zamonaviy JavaScript muhitida ishlataman?" deb aytadi. Misol kodimiz:
target: "es2020" bo'lsa, chiqqan .js deyarli o'zgarmaydi β async, arrow funksiya va class shundayligicha qoladi, chunki zamonaviy muhit ularni allaqachon tushunadi:
target: "es5" bo'lsa (juda eski brauzerlar uchun), TypeScript bu zamonaviy sintaksisni pasaytiradi ("downlevel"): classni oddiy functionga, asyncni esa katta __awaiter yordamchi blokiga aylantiradi. Natijada kod ko'p, og'ir va o'qish qiyin bo'ladi.
π 2026 holati: TypeScript 6.x da target: "es5" eskirgan (deprecated) deb belgilangan va kelajakda olib tashlanadi. Zamonaviy maslahat β kamida es2020, ko'pincha es2022 tanlash. Hozir brauzerlar ham, Node.js ham zamonaviy JavaScript'ni to'liq tushunadi, demak eski es5ga "pasaytirish"ning hojati yo'q β u faqat kodni shishiradi.
π‘ target lib bilan ham bog'liq: targetni o'zgartirsangiz, mos keladigan standart tiplar to'plami (lib) ham o'zgaradi. Masalan target: "es2015" da String.prototype.replaceAll (u keyinroq qo'shilgan) mavjud emas deb hisoblanadi va uni ishlatsangiz xato chiqadi. Buni keyinroq lib bo'limida ko'ramiz.
module β import/export qanday yoziladi¶
module chiqqan JavaScript'da modullar qaysi uslubda yozilishini belgilaydi. Manba kodingiz o'zgarmaydi β faqat natija. Bitta import { x } from "./m" qatori:
module: "commonjs" da (eski, an'anaviy Node uslubi):
module: "esnext" da (zamonaviy ESM β ECMAScript Modules):
π Qaysi birini tanlash kerak? Bu loyiha turiga bog'liq:
- Zamonaviy Node.js loyihasi uchun β "nodenext" (Node'ning o'zi qaysi uslubni kutishini avtomatik hal qiladi).
- Brauzer/bundler (Vite, esbuild, webpack) bilan ishlovchi loyiha uchun β "esnext".
- Eski Node yoki maxsus muhit uchun β "commonjs".
π‘ module bilan birga ko'pincha moduleResolution ham sozlanadi β u TypeScript import "./m" da faylni qanday qidirishini belgilaydi. Zamonaviy qiymatlar: bundler ishlatsangiz "bundler", Node loyihasida "nodenext". Ikkalasi mos kelishi kerak: "module": "nodenext" bilan "moduleResolution": "nodenext" birga yuradi.
outDir va rootDir β fayllar qayerga tushadi¶
Bu juftlik papka tuzilishini tartibga soladi:
rootDirβ manba.tsfayllaringiz qayerda ("./src").outDirβ compile qilingan.jsfayllar qayerga tushishi ("./dist").
src/index.ts β compile β dist/index.js. Manba va natija aralashmaydi: srcda faqat siz yozgan .ts, distda esa faqat mashina chiqargan .js. dist papkasini odatda Git'ga qo'shmaydilar (.gitignorega yoziladi) β chunki uni istalgan vaqtda qaytadan yaratsa bo'ladi.
π rootDir yozmasangiz, TypeScript uni manba fayllaringiz orasidan o'zi taxmin qiladi. Lekin uni aniq yozish xavfsizroq: aks holda noto'g'ri faylni tasodifan qo'shsangiz, butun chiqish tuzilishi siljib ketishi mumkin.
lib β qaysi tiplar "mavjud" deb hisoblanadi¶
lib β TypeScript'ga "qaysi tayyor tiplar (standart kutubxonalar) mavjud?" deb aytadi. Masalan, document yoki window (brauzer narsalari) tiplari "dom" kutubxonasida; Promise, Map esa "es2015"da.
π Odatda libni alohida yozmaysiz β TypeScript uni targetdan kelib chiqib o'zi tanlaydi (target: "es2022" β es2022 tiplari + default dom). Uni faqat maxsus holatda yozasiz:
- Server (Node) loyihasida brauzer tiplari kerak emas β "lib": ["es2022"] deb domni olib tashlasangiz, kodda tasodifan documentga murojaat qilsangiz darrov xato chiqadi (server'da document yo'q-ku).
- Brauzer loyihasida esa domni qoldirasiz, chunki document, localStorage kabilar kerak.
π‘ 19-bob to'liq DOM va brauzer tiplariga bag'ishlangan β u yerda lib: ["dom"] qanday ishlashini batafsil ko'rasiz.
esModuleInterop β eski va yangi modullarni do'st qilish¶
CommonJS modullari (module.exports = ...) va ES modullari (export default ...) bir-biriga har doim ham silliq ulanmaydi. esModuleInterop: true shu ikkisi orasidagi "import" qoidalarini moslashtiradi β natijada eski paketlarni zamonaviy import sintaksisi bilan tabiiy chaqira olasiz:
π Bu deyarli har bir zamonaviy loyihada true bo'ladi β tsc --init ham uni default yoqib beradi. Uni false qilsangiz, ko'p paketlarni g'alati import * as ... shaklida chaqirishga majbur bo'lasiz. Qisqasi: qoldiring true.
skipLibCheck β kutubxona tiplarini qayta tekshirmaslik¶
node_modules ichidagi paketlar o'zlari bilan .d.ts (tip) fayllarini olib keladi. skipLibCheck: true TypeScript'ga "o'sha tashqi .d.ts fayllarni ichidan qayta tekshirma, ishonib o'tib ket" deydi.
π Nega kerak? Birinchidan, tezlik β yuzlab paketning tiplarini har safar tekshirish vaqt oladi. Ikkinchidan, ba'zan ikki paketning tip fayllari o'zaro mos kelmay, sizning kodingizga aloqasi yo'q xatolar chiqaradi. skipLibCheck shu shovqinni o'chiradi. Bu sanoatda deyarli standart β true qiling.
π‘ Muhim farq: skipLibCheck faqat kutubxonalarning .d.ts fayllarini o'tkazib yuboradi. Sizning kodingiz har doim to'liq tekshiriladi β demak xavfsiz.
sourceMap va declaration β qo'shimcha fayllar¶
Ikki foydali "qo'shimcha chiqish" sozlamasi:
-
sourceMap: trueβ har.jsyoniga.js.mapfayl chiqaradi. U brauzer/Node'ga "bu JavaScript qatori aslida qaysi.tsqatoridan kelgan"ini aytadi. Natijada xato bo'lganda brauzer dev-tools sizga asl.tsni ko'rsatadi, compile qilingan tushunarsiz.jsni emas. Debug uchun bebaho. -
declaration: trueβ har.tsyoniga.d.ts(tip) fayl chiqaradi. Bu kutubxona yozayotganlar uchun: sizning paketingizdan foydalanadigan boshqa odamlar.jskodni oladi,.d.tsesa ularga tiplaringizni beradi β IDE'da avtomatik to'ldirish ishlaydi.
Tavsiya etilgan konfiguratsiyani compile qilganda dist papkada uchta fayl paydo bo'ladi:
dist/index.js <- ishga tushadigan JavaScript
dist/index.js.map <- sourceMap (debug uchun)
dist/index.d.ts <- tip fayli (declaration)
π declaration odatda faqat kutubxona/paket loyihalarida true qilinadi. Oddiy ilova (web sayt, server) yozayotgan bo'lsangiz, hech kim sizning ichki tiplaringizni import qilmaydi β demak declaration shart emas. sourceMap esa deyarli doim foydali.
noEmit β faqat tekshir, fayl chiqarma¶
2-bobda ko'rgan edik: noEmit: true TypeScript'ga "tekshir, lekin .js umuman yaratma" deydi.
π Bu qachon kerak? Zamonaviy loyihalarda ko'pincha .ts β .js aylantirishni boshqa, tezroq asbob (Vite, esbuild, Babel) bajaradi. Bunday holda tscning yagona vazifasi β tip qo'riqchisi bo'lib qolish. Aynan shu yerda noEmit ishlatiladi: tsc butun loyihani tekshiradi, lekin hech narsa chiqarmaydi. Buni odatda package.jsonda skript qilib saqlashadi:
π‘ noEmit bilan outDir/declaration birga turishi ziddiyat emas: noEmit ustun keladi β hech narsa chiqmaydi. Lekin chalkashmaslik uchun, faqat tekshiruvga ishlatadigan konfiguratsiyada outDir kabilarni yozmaslik tozaroq.
paths va alias β uzun import yo'llaridan qutulish¶
Katta loyihada import yo'llari uzayib, xunuklashib ketadi:
paths bilan bunga qisqa alias (taxallus) beramiz:
Endi har qayerda, qancha papka chuqurda bo'lsangiz ham, shunchaki:
@utils/math β TypeScript uni ./src/utils/math deb hal qiladi. Yo'l doim loyiha ildizidan hisoblanadi, "necha papka ortga chiqdim?" deb sanashning hojati qolmaydi.
π 2026 holati β muhim o'zgarish: Eski qo'llanmalarda paths bilan birga baseUrl yozish talab qilinardi. TypeScript 6.x da baseUrl eskirgan (deprecated): uni yozsangiz, "Option 'baseUrl' is deprecated" ogohlantirishi chiqadi. Endi pathsdagi yo'llar tsconfig.json turgan papkaga nisbatan yoziladi β yuqoridagi misoldek ["./src/utils/*"] deb. Demak baseUrlni umuman yozmang.
π Yana bir muhim nuqta: paths faqat TypeScript'ga alias'ni tushuntiradi β kompilyator import'ni to'g'ri hal qiladi va tekshiradi. Lekin yakuniy ishga tushiradigan muhit (Node yoki bundler) ham bu alias'ni bilishi kerak. Shuning uchun amalda paths bundler (Vite, webpack) yoki tsx/tsconfig-paths kabi asbob bilan birga ishlatiladi β ular ham bir xil alias'ni tushunadigan qilib sozlanadi.
Tavsiya etilgan boshlang'ich konfiguratsiya¶
Endi hammasini birlashtiramiz. Quyidagi β zamonaviy Node.js loyihasi uchun ishonchli boshlang'ich nuqta. Bu konfiguratsiya yuqorida sinab ko'rilgan misol kod bilan toza compile bo'ladi va distga .js, .js.map, .d.ts chiqaradi:
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true,
"outDir": "./dist",
"rootDir": "./src",
"sourceMap": true,
"declaration": true
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
Tekshiruv:
π forceConsistentCasingInFileNames β bu kichik, lekin foydali qo'shimcha: import "./User" va import "./user" ni har xil deb belgilaydi. Windows/macOS fayl nomida katta-kichik harfni ajratmaydi, Linux esa ajratadi β bu flag "menda ishlaydi, serverda ishlamaydi" turidagi xatoning oldini oladi.
Loyiha turiga qarab nima o'zgaradi¶
Asos bir xil β faqat bir-ikki qatorni loyiha turiga moslaysiz:
Brauzer (frontend, bundler bilan):
{
"compilerOptions": {
"target": "es2022",
"module": "esnext",
"moduleResolution": "bundler",
"lib": ["es2022", "dom", "dom.iterable"],
"strict": true,
"skipLibCheck": true,
"noEmit": true
},
"include": ["src/**/*"]
}
dom tiplari kerak (document, window); compile'ni bundler qiladi, shuning uchun tsc faqat tekshiradi (noEmit).
Node.js (server/CLI):
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": ["es2022"],
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
dom yo'q (serverda document bo'lmaydi); tsc haqiqiy .js chiqaradi.
Kutubxona (boshqalar import qiladigan paket):
{
"compilerOptions": {
"target": "es2020",
"module": "esnext",
"moduleResolution": "bundler",
"strict": true,
"skipLibCheck": true,
"declaration": true,
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src"
},
"include": ["src/**/*"],
"exclude": ["node_modules", "dist"]
}
declaration: true β foydalanuvchilarga tiplaringizni .d.ts shaklida berasiz (21-bob); target biroz pastroq (es2020) β ko'proq muhitda ishlasin.
π‘ Tayyor, sinalgan asoslar ham bor: @tsconfig/node22, @tsconfig/strictest kabi paketlarni extends orqali ulab, ustiga faqat o'zingizning outDir/includeingizni qo'shsangiz, eng yangi tavsiyalarni "tekin" olasiz. Boshlaganda esa yuqoridagi qo'lda yozilgan asoslar to'la yetadi va har qatorning nimaligini bilib turasiz.
Endi tsconfig.json siz uchun sirli fayl emas: uning uch bloki, strict oilasi, target/module chiqishga qanday ta'sir qilishi va har loyiha turi uchun ishonchli boshlang'ich konfiguratsiya β hammasi qo'lingizda. Eng muhim xulosa bitta jumlada: "strict": true yozing, qolganini loyiha turiga moslang. Keyingi bobda shu sozlamalardan biri β lib: ["dom"] β ochadigan dunyoga, brauzer va DOM bilan TypeScript ishlashga o'tamiz. Avval esa quyidagi mashqlarni bajaring: ularning ko'pchiligida bitta sozlamani o'zgartirib, natijani o'z ko'zingiz bilan ko'rasiz β bilim aynan shunday mustahkamlanadi.
18-bob mashqlari¶
- Yangi
ts-config-mashqpapkasi yarating,npm init -yqiling,npm i -D typescriptbilan TypeScript o'rnating, so'ngnpx tsc --initbilantsconfig.jsonyarating. Faylni oching β qancha sozlama (ko'pchiligi sharh ostida) borligini ko'ring. - Yaratilgan
tsconfig.jsondacompilerOptions,includevaexcludebloklarini toping. Agarinclude/excludeyo'q bo'lsa, ularni o'zingiz qo'shing:"include": ["src/**/*"],"exclude": ["node_modules"]. srcpapkasini yarating, ichigaindex.tsyozing (oddiyconsole.log("salom")).npx tscishlating va.jsfayl qaysi papkaga tushganini ko'ring. EndioutDirni"./dist",rootDirni"./src"qiling va qayta compile qilib farqni kuzating.tsconfig.jsondan"strict": trueni vaqtincha olib tashlang (yokifalseqiling). Tipsiz parametrli funksiya yozing:function ikkilantir(son) { return son * 2; }. Xato chiqdimi? Endistrictni qaytaring va qayta tekshiring β xato kodini (TS....) yozib oling.strictyoqilgan holatdafunction birinchiHarf(matn: string | null): string { return matn[0]; }yozing. Qanday xato chiqdi? Endistrictni o'chiring va xatoning yo'qolishini kuzating β bustrictNullChecksning ta'siri.- 5-mashqdagi funksiyani
strictyoqilgan holda to'g'rilang:if (matn === null)bilannullholatini alohida hal qiling. Toza compile bo'lganiga ishonch hosil qiling. interface Foydalanuvchi { id: number; ism: string; telefon?: string }yozing.u.telefonni to'g'ridan-to'g'ri.toUpperCase()qilib ko'ring βstrictNullChecksqanday xato beradi? Keyinif (u.telefon)bilan himoyalab tuzating.tsconfig.jsonda"target": "es5"qiling (ogohlantirish chiqishi mumkin β eskirganligi haqida).const f = async () => 42;yozgan faylni compile qiling va chiqqan.jsni oching. Enditargetni"es2020"qilib qayta compile qiling β chiqqan.jsqanchalik soddalashdi?- 8-mashqdagi
.jsfayllarni yonma-yon solishtiring:es5da paydo bo'lgan__awaiterkabi qo'shimcha kod nima uchun kerak bo'ldi?es2020da nega u yo'q? "module": "commonjs"qilib,import/exportishlatadigan ikki fayl (m.tsvamain.ts) yozing va compile qiling. Chiqqan.jsdarequirevaexportsni toping. Endi"module": "esnext"(va"moduleResolution": "bundler") qilib qayta compile qiling β natijadaimportqoldimi?"esModuleInterop": falseqilib ko'ring (agar paket o'rnatgan bo'lsangiz, masalanimport x from "..."shaklida). Qanday muammo chiqdi? Keyintrueqaytaring. Farqni o'z so'zingiz bilan ayting."sourceMap": trueqilib compile qiling.distpapkada qanday qo'shimcha fayl paydo bo'ldi? Uning kengaytmasi qanday? Bu fayl nima uchun kerakligini izohlang."declaration": trueqilib compile qiling.distda qanday.d.tsfayl paydo bo'ldi? Uni oching β ichida nima bor, sizning.tskoddan qanday farq qiladi?"noEmit": trueqiling vanpx tscishlating. Bu safar.jsfayl yaratildimi?package.jsonningscriptsqismiga"type-check": "tsc --noEmit"qo'shing vanpm run type-checkbilan ishlating.pathsalias sinang:tsconfig.jsonga"paths": { "@utils/*": ["./src/utils/*"] }qo'shing (baseUrlYOZMANG β u eskirgan).src/utils/math.tsyarating, unisrc/index.tsdaimport { ... } from "@utils/math"bilan chaqiring vanpx tsc --noEmittoza o'tishini tekshiring."lib": ["es2022"]qilib (domsiz),index.tsdadocument.titlega murojaat qiling. Qanday xato chiqdi? Endilibga"dom"qo'shing β xato yo'qoldimi? Bu Node vs brauzer farqini qanday tushuntiradi?"strict"ni o'chirib, o'rniga uning a'zolarini bittalab yozib ko'ring: faqat"noImplicitAny": true. Tipsiz parametr xato beradi, lekinstring | nullgamatn[0]xato bermaydi (chunkistrictNullChecksyoqilmagan). Bustrictning nega "oila" ekanini qanday ko'rsatadi?"forceConsistentCasingInFileNames": trueqiling.import "./User"deb yozing, lekin fayl nomiuser.tsbo'lsin. Qanday xato chiqdi? Bu Windows va Linux orasidagi qanday muammoning oldini oladi?- Bobdagi "tavsiya etilgan Node.js konfiguratsiyasi"ni to'liq ko'chirib,
tsconfig.jsoningizga qo'ying.src/index.tsga kichik tiplangan funksiya yozing vanpx tsctoza o'tib,distda.js,.js.map,.d.tspaydo bo'lganini tasdiqlang. - Uchta loyiha turi (Node, brauzer, kutubxona) uchun tavsiya konfiguratsiyalarini yonma-yon qo'ying va farqlarini ro'yxat qiling: qaysida
lib: ["dom"]bor, qaysidanoEmit, qaysidadeclaration: true, va nega β har birini bitta jumla bilan izohlang.