Node 23 va putea rula fișierele .ts fără extra configurații.
Un PR fără care elimină flag-ul --experimental-strip-types
a fost trimis de Marco Ippolito în Node 23. Practic asta înseamnă că:
poți crea un fișier
index.ts
cu sintaxă typescriptpoți lansa
node index.ts
fără alte flag-urinode va elimina declarațiile de tip folosind swc, apoi va rula codul rezultat
Suportul pentru typescript a fost în continuă dezvoltare pentru node în ultimii 5 ani, dar datorită efortului voluntar al contributorilor, acum acesta va fi disponobil în versiunile Node 22 și Node 23.6. Ce înseamnă asta mai pe larg?
Cum îl poți încerca?
Dacă ai o versiune de node peste 22.6, poți rula fișiere typescript (.ts) folosind steagul --experimental-strip-types:
node --experimental-strip-types index.ts
Node nightly și începând cu versiunea 23.6 va putea rula implicit fișierele cu sintaxa typescript, fără să mai adaugi steagul.
Face node typecheck?
Nu, nodejs nu va valida tipurile din fișierele Typescript. Vei fi nevoit să rulezi tsc sau alt utilitar pentru type-check și sintaxă în alt proces: tsc --watch
.
Ce ar trebui să pun în tsconfig?
# tsconfig.json (node >= 23.6)
{
"compilerOptions": {
/* Base Options: */
"esModuleInterop": true,
"skipLibCheck": true,
"target": "es2022",
"allowJs": true,
"resolveJsonModule": true,
"moduleDetection": "force",
"isolatedModules": true,
"verbatimModuleSyntax": true,
/* Strictness */
"strict": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
/* Node Stuff */
"allowImportingTsExtensions": true,
"module": "NodeNext",
"noEmit": true,
/* If your code doesn't run in the DOM: */
"lib": [
"es2022"
],
}
}
Suportă enums și namespaces?
Enums și namespaces nu sunt suportate implicit. Pentru o listă completă puteți vedea aici: nodejs.org/api/typescript.html#type-stripping. Dacă vreți suport pentru alte caracteristici specifice typescript folosiți steagul --experimental-transform-types
.
Dar nici runtime namespaces nu sunt suportate încă, doar type only (declare namespace).
Este necesară transpilarea la JavaScript în producție?
Pentru aplicații Node, dacă livrezi codul pe o platformă serverless atunci da, cold start-ul va fi semnificativ mai rapid pe codul transpilat. În schimb dacă ai o apicație pentru care nu este foarte important acest metric, atunci timpul adăugat la prima pornire a aplicației este nesemnificativ.
Un posibil impact de performanță poate apărea în cazul în care încarci altă librărie TypeScript în timpul rulării aplicației. Node va fi nevoit să transpileze și aceste librării.
Pentru librării (și pachete npm): da, acestea necesită să fie transpilate la Javascript, altfel nu vor putea fi folosite în proiectele Javascript. De asemenea și cei care folosesc Typescript vor putea încărca fișierele cu delarațiile de tipuri (.d.ts).
Monorepo-uri: în cazul unei librării într-un monorepo recomandarea este să se facă traspilarea, din aceleași motive menționate mai sus.
Va fi disponibil sportul în versiuni mai vechi?
Suportul implicit pentru typescript, va fi disponibil în Node 22, dar nu și în Node 20 sau mai vechi.
Referințe: