Mundarija (26)
- Bu darsda
- 1. Nega bu kerak?
- 2. Type stripping: turlar bo'sh joyga aylanadi
- 2.1 Birinchi .ts
- 2.2 Ichkarida nima bo'ladi
- 2.3 Turlar tekshirilmaydi
- 3. Strip-only: nima ishlamaydi
- 3.1 O'chirib bo'lmaydigan sintaksis
- 3.2 Ishlaydiganlar
- 3.3 erasableSyntaxOnly: xatoni oldindan ushlash
- 3.4 Import qoidalari
- 4. --experimental-transform-types va Node 26
- 5. Boshqa yo'llar: tsx, ts-node, tsc build
- 5.1 O'lchov
- 5.2 Taqqoslash
- 6. Nega npm'ga baribir dist/?
- 7. CLI qadami: holat 41 va commit
- 8. Ko'p uchraydigan xatolar
- 9. Mashqlar
- 1-mashq (oson): ishlaydimi?
- 2-mashq (o'rta): enum siz qayta yozing
- 3-mashq (qiyin): strip-only tekshiruvchi
- 4-mashq: CLI qadami
- 10. Real ishda
- Xulosa
- Manbalar
TypeScript'ni Node.js'da to'g'ridan ishga tushirish: type stripping, erasableSyntaxOnly va tsx
Qisqacha: Node 24
.tsfaylni o'zi ishga tushiradi:node app.ts. U turlarni bo'sh joy bilan almashtirib o'chiradi (type stripping) va qolgan JS'ni bajaradi. Turlarni tekshirmaydi — bunitsc --noEmitqiladi. Faqat "o'chiriladigan" sintaksis ishlaydi:enum, qiymatlinamespacevaconstructor(private x)yiqiladi.tsconfigdagierasableSyntaxOnlyularni oldindan ushlaydi.valyutada dev uchun.tsto'g'ridan (164 ms), npm paketi uchun esatscbuild qilingandist/(103 ms).
Bu darsda
node fayl.tsichida nima bo'lishini va nega tip xatosi dasturni to'xtatmasligini tushuntira olasiz.- Strip-only rejimda ishlamaydigan sintaksisni haqiqiy xato xabarlari bilan taniysiz va o'rniga nima yozishni bilasiz.
erasableSyntaxOnly,verbatimModuleSyntax,allowImportingTsExtensionsnima uchun kerakligini bilasiz.- Node, tsx, ts-node va
tscbuild'ni o'lchov bilan solishtirasiz. valyutaning holat 41 ini tekshirib, commit qilasiz.
Oldin bilishingiz kerak: TypeScript'ni o'rnatish va ishga tushirish, enum va uning muqobillari, tsconfig.json chuqur, Build: tsc, bundler'lar va tsgo, --watch, --env-file va node --run.
1. Nega bu kerak?
15-qismda TypeScript ikki bosqichda ishlardi: tsc → dist/*.js → node dist/app.js. Har o'zgarishdan keyin build. Testlar uchun ham build yoki qo'shimcha paket.
valyuta boshidan boshqacha yozilgan: package.json da "start": "node src/bin.ts". Build yo'q, ts-node yo'q, tsx yo'q. O'tgan darsdagi node --watch src/bin.ts ham .ts ni to'g'ridan oldi. Bu qanday ishlaydi? Va nega npm'ga baribir dist/ chiqaramiz?
O'xshatish: kitobning chetidagi qalam bilan yozilgan eslatmalar. O'qish uchun ularni o'chirg'ich bilan o'chirish yetadi — matnning o'zi o'zgarmaydi. Type stripping — xuddi shu o'chirg'ich. Lekin ba'zi "eslatmalar" matnning o'rnini egallagan (enum): ularni o'chirsangiz, gap buziladi. Node bunday joyda to'xtaydi.
2. Type stripping: turlar bo'sh joyga aylanadi
2.1 Birinchi .ts
Ikki fayl: kurs.ts interfeys va funksiyani eksport qiladi, app.ts ularni ishlatadi.
// kurs.ts
export interface Kurs {
kod: string;
qiymat: number;
}
export function konvert(miqdor: number, k: Kurs): number {
return miqdor * k.qiymat;
}// app.ts
import { konvert, type Kurs } from "./kurs.ts";
const usd: Kurs = { kod: "USD", qiymat: 11903.15 };
const natija: number = konvert(100, usd);
console.log(`100 USD = ${natija.toFixed(2)} so'm`);Biz ishga tushirdik (Node 24.21.0, Windows 11):
node app.ts100 USD = 1190315.00 so'mHech qanday bayroq, ogohlantirish yoki tsconfig kerak bo'lmadi. Node 24 da type stripping sukut bo'yicha yoqilgan va barqaror (hujjat: 23.6.0 va 22.18.0 dan sukut bo'yicha yoqilgan, 24.12.0 dan "Stable").
2.2 Ichkarida nima bo'ladi
Node .ts faylni o'qiydi va har tur yozuvini (: number, interface …, type Kurs importi) bo'sh joy bilan almashtiradi. Qolgan matn — oddiy JS. Hujjatda aynan shunday: "Node.js TypeScript sintaksisini bo'sh joy bilan almashtiradi, tur tekshiruvi bajarilmaydi".
flowchart LR
T["app.ts<br/>const usd: Kurs = …"] --> S["type stripping<br/>(bo'sh joy)"]
S --> J["const usd = …<br/>(bo'sh joy)"]
J --> V["V8 bajaradi"]
S -. "enum, namespace" .-> X["ERR_UNSUPPORTED_<br/>TYPESCRIPT_SYNTAX"]Rasmdagi asosiy yo'l: turlar o'chadi, qolgani V8 ga ketadi. Pastki uzuq strelka — o'chirib bo'lmaydigan sintaksis: Node uni bajarmaydi.
Nega aynan bo'sh joy? Shunda har qator va ustun raqami o'zgarmaydi. Xato bo'lsa, stack trace sizning .ts faylingizdagi to'g'ri joyni ko'rsatadi — source map kerak emas. Hujjat ham shuni aytadi: source map kerak emas, Node uni yaratmaydi. Biz tekshirdik — faylning boshida interface va type, 7-qatorda throw:
Error: yiqildi
at yiqil (file:///C:/Users/…/qator.ts:7:9)qator.ts:7:9 — faylda throw aynan 7-qatorning 9-ustunida. Turlar o'chdi, joylar qoldi.
2.3 Turlar tekshirilmaydi
Eng muhim qoida. Ataylab xato tur yozdik:
const narx: number = "35 000";
console.log(narx, typeof narx);Xato:
TS2322: Type 'string' is not assignable to type 'number'.Bu — tsc ning xabari ("string turini number ga berib bo'lmaydi"). Node esa shu faylni bemalol bajardi:
node tur.ts35 000 stringNode uchun : number — o'chiriladigan matn, xolos. Shuning uchun type stripping bilan ishlaganda tekshiruv alohida qadam: tsc --noEmit (kanonda npm run tip). valyuta ning check skripti aynan shunday: npm run tip && npm run lint && npm test.
Tekshirib ko'ring: Hamkasbingiz aytdi: "Node 24 TypeScript'ni qo'llaydi, demak
tscendi kerak emas". To'g'rimi?
Javob
Qisman. Ishga tushirish uchun tsc kerak emas — Node turlarni o'zi o'chiradi. Lekin tekshirish uchun kerak: Node const narx: number = "35 000" ni ham bajaradi. tsc --noEmit (yoki IDE) bo'lmasa, TypeScript'ning asosiy foydasi — xatoni oldindan ushlash — yo'qoladi. npm paketi uchun .js va .d.ts chiqarishda ham tsc kerak (pastda).
3. Strip-only: nima ishlamaydi
3.1 O'chirib bo'lmaydigan sintaksis
Ba'zi TS yozuvlari faqat tur emas — ular JS kodi hosil qiladi. enum Format { Jadval, Json } aslida obyekt yaratadi (enum darsi). Uni o'chirsangiz, Format.Json ga murojaat qiladigan kod buziladi. Node bunday joyda to'xtaydi. Biz sinagan to'rt holat:
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript enum is not supported in strip-only mode
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript namespace declaration is not supported in strip-only mode
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: TypeScript parameter property is not supported in strip-only mode
SyntaxError [ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX]: The angle-bracket syntax for type assertions, `<T>expr`, is not supported in type strip mode. Instead, use the 'as' syntax: `expr as T`.Tarjimasi: "strip-only rejimida (faqat o'chirish) enum / namespace e'loni / parametr xususiyati (constructor(private x)) qo'llanmaydi". To'rtinchisi: "<T>qiymat ko'rinishidagi tur tasdig'i ishlamaydi — qiymat as T yozing".
Qiziq joy: faqat tur saqlaydigan namespace ishladi:
namespace Tur {
export type Kod = string;
}
const k: Tur.Kod = "USD";
console.log(k); // USDUnda JS kodi yo'q — butunlay o'chiriladi. export const SOM = "UZS" kabi qiymat qo'shilsa — yiqiladi.
3.2 Ishlaydiganlar
Hamma "oddiy" TS: interface, type, generiklar, as, as const, satisfies, ! (non-null), declare, import type, abstract, readonly, funksiya overload e'lonlari. Bitta faylda bir nechtasini sinadik:
const narx = 35000 as const;
const m = { osh: narx } satisfies Record<string, number>;
function f<T>(a: T): T {
return a;
}
console.log(f(m)!); // { osh: 35000 }3.3 erasableSyntaxOnly: xatoni oldindan ushlash
Node xatosini ishga tushirgandagina ko'rasiz. Yaxshisi — muharrir va tsc da. TypeScript 5.8 dan tsconfig da erasableSyntaxOnly sozlamasi bor: "faqat o'chiriladigan sintaksisga ruxsat". U yoqilganda tsc o'sha joylarni o'zi xato deydi:
// @ts-options: {"erasableSyntaxOnly": true}
enum Format { Jadval, Json }
class Hamyon {
constructor(private som: number) {}
}
console.log(Format.Json, new Hamyon(1));Xato:
TS1294: This syntax is not allowed when 'erasableSyntaxOnly' is enabled.
TS1294: This syntax is not allowed when 'erasableSyntaxOnly' is enabled."Bu sintaksisga erasableSyntaxOnly yoqilganda ruxsat yo'q". O'rniga nima yoziladi — enum darsidagi muqobillar: as const obyekt va oddiy maydon yoki # maxfiy maydon:
// @ts-options: {"erasableSyntaxOnly": true}
const Format = { Jadval: "jadval", Json: "json" } as const;
type Format = (typeof Format)[keyof typeof Format];
class Hamyon {
#som: number;
constructor(som: number) {
this.#som = som;
}
get balans(): number {
return this.#som;
}
}
const f: Format = Format.Json;
console.log(f, new Hamyon(5000).balans);Konsolda:
json 5000Bu kod ham tsc dan, ham Node'ning strip-only rejimidan o'tadi. Saytdagi «Ishga tushir» ham uni bajaradi (u ham turlarni o'chiradi).
3.4 Import qoidalari
Node tsconfig.json ni o'qimaydi. Shuning uchun import Node'ning o'z qoidasiga bo'ysunadi. Ikkita tuzoqni sinadik.
Kengaytmasiz import. from "./kurs":
Error [ERR_MODULE_NOT_FOUND]: Cannot find module 'C:\Users\…\kurs' imported from C:\Users\…\app2.ts"kurs modulini topib bo'lmadi". ES Modules darsidagidek, Node fayl kengaytmasini taxmin qilmaydi: ./kurs.ts deb to'liq yozing. tsc buni xato demasligi uchun tsconfig da allowImportingTsExtensions: true kerak.
Turni type siz import qilish. import { konvert, Kurs } from "./kurs.ts":
SyntaxError: The requested module './kurs.ts' does not provide an export named 'Kurs'"./kurs.ts moduli Kurs nomli eksport bermaydi". To'g'ri — interfeys o'chirilgan, JS'da Kurs yo'q. Node faqat bitta faylni ko'radi va qaysi import tur ekanini bilmaydi. Yechim: type Kurs yoki import type. tsconfig dagi verbatimModuleSyntax: true buni tsc darajasida majburiy qiladi.
Yana to'rt cheklov (hujjat bo'yicha): tsconfig dagi paths taxalluslari (@/kurs) ishlamaydi — eng yaqin muqobil # bilan boshlanadigan package.json imports; .tsx (JSX) qo'llanmaydi; dekoratorlar JS'ning o'zida paydo bo'lguncha ishlamaydi; node_modules ichidagi .ts qayta ishlanmaydi (pastda — kanon topilmasi).
Tekshirib ko'ring:
src/turlar.tsfaqatexport type Valyuta = "USD" | "EUR"ni saqlaydi.bin.tsdaimport { Valyuta } from "./turlar.ts"yozildi.node src/bin.tsnima qiladi vatsc(verbatimModuleSyntax bilan) nima deydi?
Javob
Node SyntaxError: The requested module './turlar.ts' does not provide an export named 'Valyuta' bilan yiqiladi — o'chirilgandan keyin turlar.ts da hech qanday eksport qolmaydi. tsc esa verbatimModuleSyntax tufayli shu importni oldindan xato deydi va import type ni talab qiladi. Ikkala holatda ham tuzatish bitta: import type { Valyuta }.
4. --experimental-transform-types va Node 26
enum ni baribir ishlatish kerak bo'lsa-chi? Node 24 da bayroq bor:
node --experimental-transform-types enum.ts1
(node:15652) ExperimentalWarning: Transform Types is an experimental feature and might change at any timeenum ishladi (Format.Json = 1), lekin "eksperimental imkoniyat, istalgan vaqt o'zgarishi mumkin" ogohlantirishi bilan. Bu bayroq — boshi berk yo'l. Node 26.0.0 (2026-05-05) reliz eslatmasining "Deprecations and Removals" ro'yxatida shunday qator bor: module: remove --experimental-transform-types (PR #61803). Ya'ni Node 26 da bu bayroq umuman yo'q. Xulosa: yangi kodda unga tayanmang — erasableSyntaxOnly bilan yozing.
Maslahat:
(node:15652)dagi raqam — jarayon ID'si (PID), sizda boshqa bo'ladi.
5. Boshqa yo'llar: tsx, ts-node, tsc build
5.1 O'lchov
Type stripping'dan oldin .ts ni bajarish uchun paketlar ishlatilardi. Bugun ularning o'rni qayerda? Biz uch usulni o'sha ikki faylli misolda solishtirdik (har biri 15 marta, aralash tartibda). "mediana" so'zidan keyingi songa qarang — 15 natija tartiblanganda o'rtada turgani:
node v24.21.0, 12th Gen Intel(R) Core(TM) i5-12500H
node app.js (tsc build) mediana 95.0 ms (min 80.4, max 143.5)
node app.ts (type stripping) mediana 144.4 ms (min 125.2, max 182.6)
tsx app.ts mediana 340.4 ms (min 300.3, max 452.0)valyuta ning kanon o'lchovi ham shu manzarani beradi (19 ta modul, kurs USD):
- node dist/bin.js (tsc build)103,5 ms
- node src/bin.ts (type stripping)164,5 ms
Manba: O'lchandi: valyuta holat 41, Node 24.21.0, Windows 11, i5-12500H, 2026-10-23
Farq +61 ms — har ishga tushishda turlarni o'chirish narxi. Kichik misolda (+49 ms) ham taxminan shuncha: narxning katta qismi o'chiruvchining o'zini yuklash. Sizda raqamlar boshqacha chiqadi, nisbat esa saqlanadi.
5.2 Taqqoslash
| Usul | Nima qiladi | Qachon |
|---|---|---|
node app.ts |
Turlarni o'chiradi; tekshirmaydi | Dev, skriptlar, testlar (node --test) |
tsx app.ts (4.23.15) |
esbuild bilan to'liq o'giradi: enum, paths, .tsx ham |
Eski kod, enumli loyiha, JSX |
ts-node (10.9.2) |
tsc API bilan o'giradi, xohlasa tekshiradi |
Eski loyihalarda uchraydi |
tsc → dist/ |
To'liq o'giradi, .d.ts va source map chiqaradi |
npm paketi, production |
Izohlar:
- tsx — biz o'rnatib sinadik:
enumva parametr xususiyati ishladi (1,5000). Narxi — 36 MBnode_modules(esbuild ikkilik fayli bilan). Start ham eng sekin: 340 ms. npm 11.19 o'rnatishda esbuild'ningpostinstallskriptini bloklagani haqida ogohlantirdi (npm warn install-scripts … esbuild@0.28.2), lekin tsx baribir ishladi — esbuild'ning tayyor ikkilik fayli alohida paketda keladi. - ts-node — oxirgi versiya 10.9.2, 2023-12-08 da chiqqan (npm reestri, 2026-10-23 holatiga). Yangi loyihada tanlamang.
- SWC (
@swc-node/register1.12.1) — tsx'ga o'xshash, Rust'da yozilgan o'giruvchi. O'rnatib sinamadik.
flowchart TB
Q{"Nima kerak?"} --> D["dev / test / skript"]
Q --> P["npm paketi / prod"]
Q --> E["enum, paths, JSX bor"]
D --> N["node fayl.ts<br/>+ tsc --noEmit"]
P --> B["tsc build → dist/"]
E --> X["tsx yoki kodni<br/>erasable qilib yozish"]Diagrammani yuqoridan o'qing: avval maqsad, keyin vosita. Ko'p loyihada birinchi va ikkinchi tarmoq birga ishlatiladi — valyuta dagidek.
6. Nega npm'ga baribir dist/?
Ikki sabab, ikkalasi kanonda o'lchangan.
1. node_modules ichida stripping taqiqlangan. Paket nashri darsida bin ni .ts ga qaratgan paketni boshqa papkaga o'rnatdik:
Error [ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING]: Stripping types is currently unsupported for files under node_modules, for "file:///C:/Users/…/ilova/node_modules/tsbin/cli.ts""node_modules ostidagi fayllar uchun turlarni o'chirish hozircha qo'llanmaydi". Bu ataylab: har paket muallifi .ts ni o'z tsconfigi bilan yozadi, Node esa uni bilmaydi. Shuning uchun paket ichida doim JS bo'lishi kerak.
2. Tezlik va moslik. dist/bin.js 61 ms tez. Va u Node 22 da ham ishlaydi: kanonda Node 22.17.0 bilan dist/bin.js ishladi, src/bin.ts esa ERR_UNKNOWN_FILE_EXTENSION bilan yiqildi — 22.17 da stripping hali sukut bo'yicha yoqilmagan. engines.node >=24 shu sababdan.
valyuta dagi bo'linish:
| Fayl / skript | Nimani ishlatadi |
|---|---|
npm run dev, npm start |
src/bin.ts — stripping |
npm test |
node --test "test/**/*.test.ts" — stripping |
npm run tip |
tsc --noEmit — tekshiruv |
npm run build (prepack) |
tsc -p tsconfig.build.json → dist/ |
package.json bin |
dist/bin.js |
Ikki tsconfigning qismi (kanon):
// tsconfig.json — tekshiruv (noEmit), Node bilan bir xil qoidalar
"erasableSyntaxOnly": true,
"verbatimModuleSyntax": true,
"allowImportingTsExtensions": true,
"noEmit": true,
// tsconfig.build.json — extends ./tsconfig.json
"noEmit": false,
"allowImportingTsExtensions": false,
"rewriteRelativeImportExtensions": true,
"outDir": "dist",
"declaration": true,
"sourceMap": truerewriteRelativeImportExtensions — build'da ./kurs.ts importini ./kurs.js ga almashtiradi. Bitta manba kod ikki rejimda ishlaydi: to'g'ridan (.ts) va build qilingan (.js).
7. CLI qadami: holat 41 va commit
O'tgan darsda dev/start skriptlari va .env.example qo'shildi. Bu darsda kod o'zgarmaydi — holat 41 ni tekshirib, ikkala darsning o'zgarishini bitta commit qilasiz.
Tekshiring:
npm run check
npm run buildKanon natijasi (holat 41): build 1.7 s, tip 0 xato, lint 0, testlar 39/39 (4.7 s); npm pack --dry-run — 53 fayl, 26.3 kB. Prod bog'liqlik 0.
Commit (kanon):
git add -A
git commit -m "Skriptlar: dev (--watch), start (--env-file-if-exists), .env.example"git status da .env ko'rinmasligi kerak — u .gitignore da.
8. Ko'p uchraydigan xatolar
| Belgi | Sabab | Davosi |
|---|---|---|
ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX … enum |
Strip-only rejim | as const obyekt; erasableSyntaxOnly yoqing |
… parameter property is not supported |
constructor(private x) |
Oddiy yoki # maydon |
does not provide an export named 'Kurs' |
Tur type siz import qilingan |
import type / type Kurs; verbatimModuleSyntax |
ERR_MODULE_NOT_FOUND … kurs |
Kengaytmasiz import | ./kurs.ts; allowImportingTsExtensions |
| Tip xatosi bor, dastur ishlayapti | Node turlarni tekshirmaydi | tsc --noEmit ni check ga qo'shing |
ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING |
Paketda .ts |
npm'ga dist/*.js chiqaring |
ERR_UNKNOWN_FILE_EXTENSION ".ts" |
Node 22.17 yoki eski | Node 24 yoki dist/ |
@/kurs topilmadi |
Node tsconfig paths ni o'qimaydi |
Nisbiy yo'l yoki package.json imports |
9. Mashqlar
Yechimlar kurs/mashqlar/24/41-typescript-node/ da.
1-mashq (oson): ishlaydimi?
Node 24 da node fayl.ts bilan (bayroqsiz):
type Kod = "USD" \| "EUR";—enum Rang { Qizil }—const x = <number>y;—const x = y as number;—const narx: number = "35 000";ishga tushadimi?
Yechim
- ha — tur taxallusi to'liq o'chadi.
- yo'q —
enumJS obyekt yaratadi, strip-only rejimdaERR_UNSUPPORTED_TYPESCRIPT_SYNTAX. - yo'q — burchakli tasdiq; xabar
asni tavsiya qiladi. - ha —
as To'chiriladi. - ha — Node turlarni tekshirmaydi; xatoni
tsc --noEmitko'rsatadi.
2-mashq (o'rta): enum siz qayta yozing
Quyidagi kod Node 24 da yiqiladi. Uni erasableSyntaxOnly bilan o'tadigan qilib qayta yozing — natija bir xil qolsin.
enum Format {
Jadval = "jadval",
Json = "json",
}
class Sozlama {
constructor(public format: Format, private kutish: number) {}
matn(): string {
return `${this.format}, ${this.kutish} ms`;
}
}
console.log(new Sozlama(Format.Json, 5000).matn());Yechim
// @ts-options: {"erasableSyntaxOnly": true}
const Format = { Jadval: "jadval", Json: "json" } as const;
type Format = (typeof Format)[keyof typeof Format];
class Sozlama {
format: Format;
#kutish: number;
constructor(format: Format, kutish: number) {
this.format = format;
this.#kutish = kutish;
}
matn(): string {
return `${this.format}, ${String(this.#kutish)} ms`;
}
}
console.log(new Sozlama(Format.Json, 5000).matn());Konsolda:
json, 5000 mspublic format → oddiy maydon, private kutish → #kutish (JS'ning haqiqiy maxfiy maydoni — tashqaridan umuman ko'rinmaydi). Faylni .ts qilib saqlab, node bilan ishga tushirsangiz ham shu chiqadi.
3-mashq (qiyin): strip-only tekshiruvchi
Kod qatorlari massividan Node strip-only rejimida muammo bo'ladigan qatorlarni topadigan findProblems(lines) funksiyasini yozing (oddiy regex bilan, mukammal bo'lishi shart emas). Har topilma — "<qator raqami>: <sabab>". Sabablar: enum (qator enum yoki const enum bilan boshlanadi), namespace (qator namespace bilan boshlanadi — tur-faqat namespace'ni farqlamang), parameter property (constructor( ichida private , public , protected yoki readonly ), angle-bracket (= <Tur> ko'rinishi). Bu toza JS — saytda «Ishga tushir» bilan sinang.
Yechim
const RULES = [
[/^\s*(export\s+)?(const\s+)?enum\s/, "enum"],
[/^\s*(export\s+)?namespace\s/, "namespace"],
[/constructor\(.*\b(private|public|protected|readonly)\s/,
"parameter property"],
[/=\s*<[A-Za-z]\w*>/, "angle-bracket"],
];
function findProblems(lines) {
const found = [];
lines.forEach((line, i) => {
for (const [re, reason] of RULES) {
if (re.test(line)) found.push(`${i + 1}: ${reason}`);
}
});
return found;
}
const code = [
"export const enum Rang { Qizil }",
"type Kod = 'USD';",
"class A { constructor(private x: number) {} }",
"const n = <number>qiymat;",
"const m = qiymat as number;",
"namespace Valyuta { export const SOM = 'UZS'; }",
];
console.log(findProblems(code).join("\n"));Konsolda:
1: enum
3: parameter property
4: angle-bracket
6: namespaceHaqiqiy loyihada bu ishni regex emas, tsc (erasableSyntaxOnly) yoki Node'ning o'zi qiladi — ular kodni to'liq tahlil qiladi. Regex "enum " so'zi satr ichida bo'lsa ham adashishi mumkin; bu mashq — qoidalarni eslab qolish uchun.
4-mashq: CLI qadami
valyuta da: (1) src/ ning istalgan fayliga vaqtincha enum Sinov { A } qo'shing va npm run tip ni ishga tushiring — TS1294 chiqsin; node src/bin.ts --help — ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX. Qaytaring. (2) npm run check va npm run build toza bo'lsin. (3) Holat 41 ni commit qiling.
Yechim
(1) da ikkala xabar ham «Strip-only: nima ishlamaydi» bo'limidagidek; tsc xatosi fayl va qator bilan: src/….ts(N,6): error TS1294: …. (2) kanonda: tip 0, lint 0, test 39/39. (3) commit xabari — «CLI qadami» bo'limidagi kanon xabari.
10. Real ishda
- Yangi Node loyihalari (2025–2026) ko'pincha shunday quriladi: dev va testlar
.tsto'g'ridan, CI'datsc --noEmit, prod/npm uchun build. 25-qismdagi server ham shu sxemada. - Eski loyihalarda
ts-node,ts-node-dev,nodemon --exec ts-nodeuchraydi. Ko'chishning birinchi qadami —erasableSyntaxOnlyni yoqib, nechta joy buzilishini ko'rish. - Bundler'lar (Vite, esbuild) ham faqat turlarni o'chiradi, tekshirmaydi — 16-qismdagi qoida bu yerda ham amal qiladi.
- Intervyu savollari: "Node
.tsni qanday bajaradi?", "Negaenumishlamaydi?", "Type stripping bo'lsa,tscnimaga kerak?".
Xulosa
- Node 24
.tsni bayroqsiz bajaradi: turlar bo'sh joyga aylanadi, qator/ustun raqamlari saqlanadi. - Turlar tekshirilmaydi —
tsc --noEmitalohida qadam (npm run tip). enum, qiymatlinamespace, parametr xususiyatlari,<T>x—ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX;erasableSyntaxOnlyularnitscda ushlaydi (TS1294).- Import:
./kurs.tsto'liq kengaytma bilan, turlarimport typebilan; Nodetsconfigni o'qimaydi. --experimental-transform-typesNode 26 da olib tashlangan; tsx — enum/JSX kerak bo'lganda (340 ms, 36 MB).- npm'ga
dist/:node_modulesichida stripping taqiqlangan, build 61 ms tez va Node 22 da ham ishlaydi.
Keyingi dars: Built-in fetch va undici — Node'da tashqi API'ga so'rov: timeout, ulanishlar havzasi, keep-alive va valyuta dagi User-Agent.
Manbalar
- Node.js 24 hujjati — Modules: TypeScript (type stripping, qo'llanmaydigan sintaksis,
node_modulescheklovi): https://nodejs.org/docs/latest-v24.x/api/typescript.html - Node.js 24 hujjati — CLI (
--no-strip-types,--experimental-transform-types): https://nodejs.org/docs/latest-v24.x/api/cli.html - Node.js 26.0.0 release notes (2026-05-05,
--experimental-transform-typesolib tashlandi): https://nodejs.org/en/blog/release/v26.0.0 - TypeScript 5.8 release notes —
--erasableSyntaxOnly: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-8.html - tsx 4.23.15, ts-node 10.9.2 (2023-12-08), @swc-node/register 1.12.1 — npm reestri, 2026-10-23.
- Kanon:
valyutaholat 41 (skriptlar,tsconfiglar), sovuq start o'lchovi, strip-only xabarlari,node_modulesstripping topilmasi, Node 22.17 farqi. Kichik misollar, tsx vatscchiqishlari — biz ishga tushirdik (Node 24.21.0, typescript 6.0.3, Windows 11).
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!