IlmHamroh
JavaScript Full-stack/15-qism. TypeScript37/47-dars16 daqiqa
Mundarija (27)

TypeScript va npm kutubxonalari: turlar qayerdan keladi — paket, @types yoki o'zingiz

Qisqacha: npm paketining turlari uch joydan keladi: paketning o'zidan (package.json dagi types yoki exports ichidagi "types"), @types/<nom> paketidan (DefinitelyTyped hamjamiyati yozgan) yoki o'zingiz yozgan declare module "<nom>" dan. Buni npm view <paket> types va npm view @types/<paket> version bilan bir daqiqada aniqlaysiz. @types versiyasi kutubxona versiyasiga mos bo'lishi kerak — eskirgan turlar to'g'ri kodni rad etadi yoki xato kodni o'tkazadi.

Bu darsda

  • Paketda turlar bor-yo'qligini npm view bilan tekshirasiz va TS7016 xabaridagi maslahatni o'qiysiz.
  • @types/* va DefinitelyTyped nima ekanini, versiyalar qanday mos kelishini tushuntirasiz.
  • Turlarsiz paketga o'zingiz minimal declare module yozasiz — va declare module "x"; qisqa yozuvi nega xavfli ekanini bilasiz.
  • Module augmentation bilan kutubxona turiga yangi metod qo'shasiz (dayjs plagini).
  • types: [] (TypeScript 7 standarti) va @types paketlari qanday birga ishlashini bilasiz.

Oldin bilishingiz kerak: Declaration fayllari (.d.ts), Modullar TypeScript'da, npm'ga birinchi qadam.

1. Nega bu kerak?

O'tgan darsda o'z eski JS faylimizga .d.ts yozdik. Endi tashqi dunyo — npm. Haqiqiy loyihada kodning katta qismi boshqalar yozgan paketlar: sanalar, vaqt, matn bilan ishlash.

«Bahor» bron tizimiga uchta kichik paket kerak bo'ldi. Sardor ularni o'rnatdi (aniq versiyalar bilan, npm'ga birinchi qadam darsidagidek):

bash
npm install --save-exact ms@2.1.3 latinize@2.0.0 dayjs@1.11.23
  • ms — "2h" kabi matnni millisekundga aylantiradi (bron davomiyligi).
  • latinize — "José Müller" → "Jose Muller": chet ellik mehmon ismini qidiruv uchun lotinlashtiradi.
  • dayjs — sanalar bilan ishlash.

Birinchi npx tsc (kodda uchala import ham bor):

text
37-kutubxonalar/guests.ts(2,22): error TS7016: Could not find a declaration file for module 'latinize'. '…/node_modules/latinize/latinize.js' implicitly has an 'any' type.
  Try `npm i --save-dev @types/latinize` if it exists or add a new declaration (.d.ts) file containing `declare module 'latinize';`
37-kutubxonalar/guests.ts(3,16): error TS7016: Could not find a declaration file for module 'ms'. '…/node_modules/ms/index.js' implicitly has an 'any' type.
  Try `npm i --save-dev @types/ms` if it exists or add a new declaration (.d.ts) file containing `declare module 'ms';`

Tanish TS7016 (.d.ts darsidan), lekin endi ikkinchi qatori bor: "Agar mavjud bo'lsa, npm i --save-dev @types/latinize ni o'rnating yoki declare module 'latinize'; qatori bor .d.ts fayl qo'shing". dayjs uchun xato yo'q — u turlarini o'zi bilan olib keladi. Uch paket — uch xil holat. Bugun har birini ko'ramiz.

2. Uch manba

flowchart TD
  A["import x from 'paket'"] --> B{"Paketda types bormi?"}
  B -- "ha" --> C["1. Paketning o'z turlari"]
  B -- "yo'q" --> D{"@types/paket bormi?"}
  D -- "ha, versiya mos" --> E["2. npm i -D @types/paket"]
  D -- "yo'q yoki eski" --> F["3. O'zingiz: declare module"]

2.1 Paketning o'z turlari

TypeScript'da yozilgan yoki turlarini o'zi saqlaydigan paketlar .d.ts ni ichida olib keladi. tsc ularni package.json dagi ikki joydan topadi:

  • types (yoki eski nomi typings) maydoni — "types": "index.d.ts".
  • exports ichidagi "types" sharti — zamonaviy paketlarda, ESM va CommonJS uchun alohida.

Tekshirish uchun paketni o'rnatish shart emas — npm view registrdan o'qiydi. Bugun (2026-10-06) olingan haqiqiy natijalar:

bash
npm view dayjs version types
text
version = '1.11.23'
types = 'index.d.ts'

date-fns da types maydoni yo'q, lekin exports da bor (npm view date-fns exports --json dan parcha):

json
{
  ".": {
    "import": {
      "types": "./index.d.ts",
      "default": "./index.js"
    },
    "require": {
      "types": "./index.d.cts",
      "default": "./index.cjs"
    }
  }
}

module: nodenext bilan tsc exports ni Node kabi o'qiydi: ESM importda — index.d.ts, require da — index.d.cts (Modullar TypeScript'da dagi .d.cts — CommonJS turlari). npmjs.com sahifasida bunday paket nomi yonida ko'k TS belgisi turadi.

2.2 @types/* — DefinitelyTyped

Ko'p mashhur paketlar JavaScript'da yozilgan va turlarini o'zi olib kelmaydi. Ular uchun DefinitelyTyped bor — GitHub'dagi ulkan hamjamiyat ombori (github.com/DefinitelyTyped/DefinitelyTyped). Undagi har bir papka npm'ga @types/<paket> nomi bilan chiqadi. @types/node ni Tur annotatsiyasi darsining mashqidan beri ishlatyapsiz — u ham shu yerdan.

Paket Versiya @types Versiya
ms 2.1.3 @types/ms 2.1.0
lodash 4.18.1 @types/lodash 4.17.25
express 5.2.1 @types/express 5.0.6
latinize 2.0.0 @types/latinize 0.2.18

(Hammasi npm view <paket> version bilan, 2026-10-06.) Qoida: @types versiyasining birinchi ikki raqami kutubxonaning birinchi ikki raqamiga mos bo'lishi kerak: ms 2.1 ↔ @types/ms 2.1, express 5 ↔ @types/express 5.0. Uchinchi raqam — turlarning o'z tuzatishlari, u farq qilishi tabiiy.

Jadvalning oxirgi qatoriga qarang: latinize — 2.0, @types/latinize esa — 0.2. Turlar eski versiya uchun yozilgan. Bu nimaga olib kelishini «Eskirgan @types» bo'limida ko'ramiz.

@types — --save-dev (devDependency) bilan o'rnatiladi: turlar faqat tsc ga kerak, ishlash paytida emas.

bash
npm install --save-dev --save-exact @types/ms@2.1.0

Shundan keyin ms xatosi yo'qoladi. Endi turlar ishlaydi — va qiziq narsa ushlanadi:

text
e.ts(3,16): error TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type '"2 soat"' is not assignable to parameter of type 'StringValue'.

ms("2 soat") — "hech bir overload mos emas: "2 soat" ni StringValue turiga berib bo'lmaydi". @types/ms da StringValue — template literal type: `${number}` + birlik ("h", "m", "Hours"…). O'zbekcha "soat" — birlik emas. JavaScript'da esa ms("2 soat") jim undefined qaytaradi (biz tekshirdik) — bron davomiyligi NaN bo'lib qolardi.

2.3 types: [] va @types — ziddiyat yo'q

tsconfig.json chuqur darsida ko'rdik: TypeScript 7 da types standart holatda []. Bu @types/ms ni o'chirib qo'yadimi? Yo'q. types faqat global turlarni boshqaradi — import qilinmasdan ko'rinadiganlarni (@types/node dagi process, Buffer). import ms from "ms" yozilganda tsc @types/ms ni modul sifatida o'zi topadi — types ro'yxatida bo'lmasa ham. Mashqlar papkamizda "types": ["node"] bor, @types/ms esa yo'q — va hammasi ishlaydi.

Tekshirib ko'ring: @types/date-fns paketi bor (2.6.3), lekin npm view uning deprecated maydonini ko'rsatadi: "This is a stub types definition. date-fns provides its own type definitions…". Uni o'rnatish kerakmi?

Javob

Kerak emas. "Stub" — "bo'sh qobiq": paket o'z turlarini olib kelishni boshlagach, DefinitelyTyped'dagi eski turlar shunday belgilanadi. date-fns 4 — exports ichida turlari bor. Eski qo'llanmalarda npm i @types/date-fns uchrasa — bu tarix.

3. O'z e'loningiz: declare module "paket"

3.1 Eskirgan @types

latinize uchun @types/latinize@0.2.18 ni o'rnatib ko'rdik. tsc — toza. Lekin 2.0 versiyadagi yangi imkoniyat — ikkinchi parametr (o'z almashtirish jadvali) — rad etildi:

text
e.ts(4,31): error TS2554: Expected 1 arguments, but got 2.

"1 ta argument kutilgan edi, 2 ta berildi". latinize("Ñandú", { "Ñ": "NY" }) ishlash paytida to'g'ri ishlaydi (NYandú), turlar esa uni bilmaydi. Eskirgan @types ikki tomonlama xavfli: to'g'ri kodni rad etadi (bu holat) yoki o'chirilgan funksiyani "bor" deb ko'rsatadi (teskarisi — ishlash paytida TypeError).

Bunday holatda o'zingiz yozasiz. Faqat ishlatadigan qismini:

ts
// 37-kutubxonalar/latinize.d.ts — latinize 2.0.0 uchun o'z e'lonimiz
// (@types/latinize 0.2.18 — eski 0.2 versiya uchun yozilgan)
declare module "latinize" {
  export default function latinize(
    str: string,
    characters?: Readonly<Record<string, string>>,
  ): string;
}

Bu — ambient modul e'loni: "latinize degan paket bor, uning standart eksporti — shunday funksiya". Fayl skript (yuqori darajada import/export yo'q) — .d.ts darsidagi declare module "*.svg" kabi. tsconfig.json ning include iga tushsa — yetarli.

Imzoni qayerdan oldik? Paketning README va manbasidan: node_modules/latinize/latinize.js da function latinize(str, characters = latinize.characters) va export default latinize. .d.ts — shu ikki qatorning tur tarjimasi.

3.2 TypeScript ushlamaydigan tuzoq: declare module "x";

TS7016 xabari eng tez yo'lni taklif qiladi — bitta qator:

ts
// shims.d.ts
declare module "latinize";

Bu qisqa (shorthand) e'lon: "latinize bor, undan import qilingan hamma narsa — any". Xato yo'qoladi — lekin tekshiruv ham:

ts
import latinize from "latinize";
const key = latinize.normalize("José");
console.log(key);

npx tsc — toza. Node esa:

text
TypeError: latinize.normalize is not a function

latinize da normalize yo'q — any hamma narsaga "ha" dedi. Qisqa e'lon TS7016 ni o'chiradi, xatolarni emas. Qoida: vaqtincha (ko'chish paytida) ishlatish mumkin, lekin TODO izohi bilan va tez orada haqiqiy imzolarga almashtiring. Bunday any qanday tarqalishini TypeScript best practices darsida ko'ramiz.

4. Module augmentation: kutubxona turini kengaytirish

4.1 dayjs plagini

dayjs'ning plagin tizimi bor: dayjs.extend(plagin) kutubxonaga yangi metod qo'shadi. «Bahor» SMS'larida sana o'zbekcha bo'lishi kerak — "6-oktabr". Metodni ishlash paytida qo'shish oson, lekin dayjs turlari uni bilmaydi. Module augmentation (modulni kengaytirish) — mavjud paketning turlariga o'z qismingizni qo'shish:

ts
// 37-kutubxonalar/guests.ts (parcha)
import dayjs from "dayjs";
import type { PluginFunc } from "dayjs";

declare module "dayjs" {
  interface Dayjs {
    toUzbek(): string;
  }
}

const MONTHS = [
  "yanvar", "fevral", "mart", "aprel", "may", "iyun",
  "iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr",
];

const uzbekDate: PluginFunc = (_options, DayjsClass) => {
  DayjsClass.prototype.toUzbek = function () {
    return `${this.date()}-${MONTHS[this.month()]}`;
  };
};
dayjs.extend(uzbekDate);
console.log(dayjs("2026-10-06").toUzbek()); // 6-oktabr

Uch qism:

Qism Nima qiladi
declare module "dayjs" { interface Dayjs { … } } turga toUzbek qo'shadi (declaration merging)
PluginFunc dayjs'ning o'z turi — plagin funksiyasining imzosi
dayjs.extend(uzbekDate) ishlash paytida metodni prototipga qo'shadi (Prototip va prototip zanjiri)

O'tgan darsda declare module modul faylda TS2664 bergan edi — "mavjud modulni kengaytirish" deb tushunilgan, *.svg esa mavjud emas edi. Bu yerda aynan shu ma'no kerak: fayl modul (import bor), "dayjs" esa haqiqatan mavjud paket. Shuning uchun e'lon kengaytirish bo'ladi va dayjs'ning Dayjs interfeysi bilan birlashadi. const MONTHS qatorlari ixcham yozilgan — uzun ro'yxatni telefonda o'qish uchun.

4.2 Global turlarni kengaytirish va uning tuzog'i

Xuddi shu usul bilan standart turlarni ham kengaytirish mumkin — declare global ichida. Lekin turga qo'shish — kodga qo'shish emas:

ts
declare global {
  interface Array<T> {
    last(): T | undefined;
  }
}
const prices = [35000, 28000];
console.log(prices.last());

tsc — xatosiz. Node esa:

text
TypeError: prices.last is not a function

Tur "last bor" dedi, uni hech kim yaratmadi. dayjs misolida dayjs.extend aynan shu ishni qilgan edi. Bu yerda ham amalga oshirish kerak:

ts
declare global {
  interface Array<T> {
    last(): T | undefined;
  }
}
Object.defineProperty(Array.prototype, "last", {
  value: function <T>(this: T[]) {
    return this[this.length - 1];
  },
});
const prices = [35000, 28000];
console.log(prices.last()); // 28000

Ishladi — lekin bu usulni (standart obyektlarning prototipini o'zgartirish) ilova kodida qilmang: boshqa kutubxona ham last qo'shsa yoki kelajakda JavaScript'ning o'zida last paydo bo'lsa, to'qnashuv bo'ladi (JavaScript'ning mashhur tuzoqlari). Oddiy funksiya — last(prices) — xavfsizroq. Augmentation kutubxonaning rasmiy plagin tizimi bilan (dayjs kabi) ishlatiladi.

Mavjud xususiyat turini o'zgartirib bo'lmaydi:

ts
declare global {
  interface Array<T> {
    length: string;
  }
}

Kompilyator:

text
TS2717: Subsequent property declarations must have the same type.  Property 'length' must be of type 'number', but here has type 'string'.

"Keyingi xususiyat e'lonlari bir xil turda bo'lishi kerak. length number bo'lishi kerak, bu yerda esa string". Declaration merging faqat qo'shadi — bor narsani o'zgartirmaydi.

5. Turlarni o'qish: node_modules ichiga qarash

Kutubxona turlari — eng aniq hujjat. VS Code'da import qilingan nom ustida F12 ("Go to Definition") — sizni .d.ts ga olib boradi: dayjs uchun node_modules/dayjs/index.d.ts, ms uchun node_modules/@types/ms/index.d.ts. Ikkinchisining boshi (izohlarsiz, telefon uchun qatorlarga bo'lingan):

ts
declare function ms(
  value: number,
  options?: { long: boolean },
): string;

declare function ms(value: ms.StringValue): number;

Ikki overload: son bersangiz — satr (ms(7200000) → "2h"), satr bersangiz — son. StringValue esa birliklar ro'yxatidan yasalgan naqsh — Template literal types darsidagi texnika haqiqiy kutubxonada. Shu tarzda o'qish ikki narsaga yordam beradi: funksiya nimani qabul qilishini README'siz bilasiz va @types eskirganmi-yo'qmi — haqiqiy kod bilan solishtira olasiz (latinize dagi kabi).

.d.ts fayllar ichida ko'pincha conditional, mapped va rekursiv turlar uchraydi. Bu qismning oldingi darslari aynan shu o'qish uchun kerak edi: endi kutubxona turi "qora quti" emas.

6. Paket o'rnatilmagan bo'lsa

Saytdagi blok va yangi papka — node_modules siz:

ts
import ms from "ms";
console.log(ms("2h"));

Kompilyator:

text
TS2307: Cannot find module 'ms' or its corresponding type declarations.

"ms moduli yoki uning tur e'lonlari topilmadi". TS7016 dan farqi: u yerda paket bor, turlari yo'q; bu yerda paketning o'zi yo'q. Tuzatish — npm install ms. (Saytdagi «Ishga tushir» tugmasi ham npm paketlarini yuklamaydi — bunday kodni o'z kompyuteringizda sinang.)

7. Ko'p uchraydigan xatolar

7.1 Turlarsiz paket

TS7016: Could not find a declaration file for module 'ms'. Tuzatish: npm view @types/ms version — bor bo'lsa va versiyasi mos bo'lsa, npm i -D @types/ms@<versiya>; yo'q bo'lsa — o'z declare module.

7.2 @types ni dependencies ga qo'yish

Ishlaydi, lekin foydalanuvchilarga keraksiz yuklanadi. Tuzatish: --save-dev. (Istisno — kutubxona yozayotgan bo'lsangiz va sizning .d.ts laringiz @types/... ga tayansa.)

7.3 Versiyasi mos kelmaydigan @types

TS2554: Expected 1 arguments, but got 2. — haqiqatda ishlaydigan chaqiruvga. Tuzatish: versiyalarni solishtiring; mos @types yo'q bo'lsa — o'z e'loningiz.

7.4 declare module "x"; bilan "tuzatish"

Hamma narsa any — TypeError ishlash paytida. Tuzatish: haqiqiy imzolar, hech bo'lmasa ishlatiladigan funksiyalar uchun.

7.5 Augmentation bor, amalga oshirish yo'q

TypeError: … is not a function. Tuzatish: turni kengaytirgan joyda ishlash paytidagi kodni ham qo'shing (plagin, extend).

8. Mashqlar

1-mashq (oson): Qaysi manba?

Har paket uchun turlar qayerdan keladi — paket (o'zida), dt (@types/*, DefinitelyTyped) yoki declare (o'zingiz yozasiz)? (Ma'lumotlar npm view dan, 2026-10-06.)

  1. nanoid 6.0.2 — types = './index.d.ts':
  2. pluralize 8.0.0 — types yo'q; @types/pluralize 0.0.33 bor, lekin 8.0 uchun emas:
  3. qrcode 1.5.4 — types yo'q; @types/qrcode 1.5.6:
Yechim

nanoid — turlarni o'zi olib keladi. qrcode 1.5 ↔ @types/qrcode 1.5 — mos. pluralize — @types versiyasi 0.0-bob kutubxonaning 8.0 versiyasiga to'g'ri kelmaydi: eskirgan bo'lishi mumkin, uni ishlatishdan oldin index.d.ts ni o'qib, haqiqiy API bilan solishtiring yoki o'zingiz yozing. Versiya raqami — birinchi signal, yakuniy hukm emas: ba'zan @types muallifi raqamni shunchaki kuzatmagan bo'ladi.

2-mashq (o'rta): ms bilan xavfsiz davomiylik

durationMinutes(text) — bron davomiyligini daqiqada qaytaradi: "90m" → 90. Parametr turini qanday yozasiz, toki durationMinutes("2 soat") tsc da to'xtasin?

Yechim
ts
import ms from "ms";

export function durationMinutes(text: ms.StringValue): number {
  return ms(text) / 60_000;
}

ms.StringValue — @types/ms dagi naqsh turi. ms bir vaqtda funksiya ham, nomlar maydoni ham (declare namespace ms + export = ms), shuning uchun ms.StringValue yozuvi ishlaydi. Parametr oddiy string bo'lsa, xato funksiya ichida chiqadi:

text
37-kutubxonalar/guests.ts(32,13): error TS2769: No overload matches this call.
  The last overload gave the following error.
    Argument of type 'string' is not assignable to parameter of type 'StringValue'.

Tur chegarada bo'lsa, xato chaqiruvchida chiqadi — "2 soat" yozilgan aniq joyda. Kutubxona turini imzoga olib chiqish — uni eng foydali qiladi.

3-mashq (qiyin): Amaliy tajriba — uch xil kutubxona

kurs/mashqlar/15/ da (umumiy package.json ga):

bash
npm install --save-exact ms@2.1.3 latinize@2.0.0 dayjs@1.11.23
npm install --save-dev --save-exact @types/ms@2.1.0

37-kutubxonalar/ da:

  • latinize.d.ts — «O'z e'loningiz» bo'limidagi fayl.
  • guests.ts — searchKey(name) (lotinlashtirilgan, kichik harf, chetdagi bo'shliqsiz), durationMinutes(text) (2-mashq), bookingDay(isoDate) (dayjs + toUzbek plagini → "6-oktabr").
  • guests.test.ts — har funksiyaga test.

Avval latinize.d.ts siz va @types/ms siz npx tsc --pretty false ni ishga tushiring — «Nega bu kerak?» bo'limidagi ikki TS7016. Keyin bittadan qo'shib, xatolar qanday yo'qolishini kuzating.

Yechim

@types/ms o'rnatilgach — faqat latinize xatosi qoladi; latinize.d.ts dan keyin — tsc toza.

ts
// 37-kutubxonalar/guests.ts — mehmonlar, bron va sanalar
import latinize from "latinize";
import ms from "ms";
import dayjs from "dayjs";
import type { PluginFunc } from "dayjs";

declare module "dayjs" {
  interface Dayjs {
    toUzbek(): string;
  }
}

const MONTHS = [
  "yanvar", "fevral", "mart", "aprel", "may", "iyun",
  "iyul", "avgust", "sentabr", "oktabr", "noyabr", "dekabr",
];

const uzbekDate: PluginFunc = (_options, DayjsClass) => {
  DayjsClass.prototype.toUzbek = function () {
    return `${this.date()}-${MONTHS[this.month()]}`;
  };
};
dayjs.extend(uzbekDate);

// "José Müller" → "jose muller": qidiruv uchun kalit
export function searchKey(name: string): string {
  return latinize(name).toLowerCase().trim();
}

// Bron davomiyligi: "90m" → 90 daqiqa
export function durationMinutes(text: ms.StringValue): number {
  return ms(text) / 60_000;
}

export function bookingDay(isoDate: string): string {
  return dayjs(isoDate).toUzbek();
}
ts
// 37-kutubxonalar/guests.test.ts
import { test } from "node:test";
import assert from "node:assert/strict";
import { searchKey, durationMinutes, bookingDay } from "./guests.ts";

test("searchKey: urg'u belgilarsiz, kichik harf", () => {
  assert.equal(searchKey("José Müller "), "jose muller");
  assert.equal(searchKey("Dilshod"), "dilshod");
});

test("durationMinutes: ms satridan daqiqa", () => {
  assert.equal(durationMinutes("90m"), 90);
  assert.equal(durationMinutes("2h"), 120);
});

test("bookingDay: o'zbekcha sana", () => {
  assert.equal(bookingDay("2026-10-06"), "6-oktabr");
});

node --test 37-kutubxonalar/guests.test.ts bizda (Node 24.21.0):

text
✔ searchKey: urg'u belgilarsiz, kichik harf (2.852ms)
✔ durationMinutes: ms satridan daqiqa (1.6286ms)
✔ bookingDay: o'zbekcha sana (3.9139ms)
ℹ tests 3
ℹ suites 0
ℹ pass 3
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 416.9837

Endi package.json ga qarang. Uchta kutubxona — dependencies da: ular kod ishlaganda kerak. @types/ms esa devDependencies da: u faqat tsc ga kerak.

Yana bir detal. MONTHS[this.month()] turi noUncheckedIndexedAccess bilan — string | undefined. Shablon satr ichida bu xato emas: undefined ham matnga aylanadi. Biz tekshiruv qo'shmadik, chunki month() doim 0–11 qaytaradi. Bunday qarorni kodda izoh bilan yozib qo'yish — yaxshi odat.

XATOLAR.md ga qo'shing: TS7016 ning paket ko'rinishi (Try npm i --save-dev @types/…), TS2307, TS2554 (eskirgan @types), TS2717 (augmentation'da tur o'zgartirish), TS2769 (ms.StringValue). Keyin kurs/mashqlar papkasidan:

bash
git add 15/package.json 15/package-lock.json
git add 15/37-kutubxonalar 15/XATOLAR.md
git commit -m "15/37: kutubxona turlari — @types, declare module"

9. Real ishda

  • Har yangi paketda birinchi savol: "turlari bormi?". npmjs.com'dagi belgi (ko'k TS — o'zida, oq-ko'k DT — @types da) yoki npm view. Turlari yo'q yoki eski paket — ko'pincha qo'llab-quvvatlanmayotgan paket belgisi: muqobilini qidirish vaqti.
  • @types/node, @types/react — eng ko'p o'rnatiladigan @types paketlari. Ularning versiyasi Node va React versiyasiga mos tanlanadi (@types/node@24 — Node 24 uchun).
  • Express (24-qism) — 5-versiyada ham turlarni o'zi olib kelmaydi: @types/express kerak. Express Request obyektiga req.user qo'shish — xuddi dayjs kabi module augmentation bilan qilinadi.
  • DefinitelyTyped'ga hissa qo'shish — ochiq manbaga birinchi qadamlardan biri: eskirgan @types ni tuzatish (masalan, latinize uchun 2.0 turlari) — portfolio uchun yaxshi tajriba.
  • Intervyu: "@types nima?", "Turlarsiz kutubxonani qanday ishlatasiz?", "Module augmentation nima?" — amaliy savollar.

Xulosa

  • Turlar uch joydan: paketning o'zi (types / exports → "types"), @types/<nom> (DefinitelyTyped), o'z declare module. Tekshirish — npm view <paket> version types va npm view @types/<paket> version.
  • @types versiyasining birinchi ikki raqami kutubxonaga mos bo'lsin; eskirgan turlar to'g'ri kodni rad etadi yoki xatoni o'tkazadi.
  • @types — --save-dev. types: [] faqat globallarga ta'sir qiladi — import qilingan paketning @types i baribir topiladi.
  • declare module "x"; — hammasi any: TS7016 yo'qoladi, tekshiruv ham.
  • Module augmentation turga qo'shadi, kodga emas — amalga oshirishni (plagin) ham yozing.

Keyingi dars: Build: tsc, bundler'lar va tsgo — zamonaviy loyihada kim turlarni tekshiradi va kim JavaScript chiqaradi: tsc --noEmit, esbuild/SWC, project references va TypeScript 7.

Manbalar

  • TypeScript Handbook: "Declaration Files — Consumption" va "Publishing" (types, exports) — typescriptlang.org/docs/handbook/declaration-files/consumption.html
  • TypeScript Handbook: "Declaration Merging" (Module Augmentation, Global augmentation) — typescriptlang.org/docs/handbook/declaration-merging.html
  • DefinitelyTyped — github.com/DefinitelyTyped/DefinitelyTyped
  • npm hujjatlari: npm view — docs.npmjs.com/cli/commands/npm-view
  • dayjs: "Plugin" — day.js.org/docs/en/plugin/plugin
Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
TypeScript va npm kutubxonalari: turlar qayerdan keladi — paket, @types yoki o'zingiz — IlmHamroh