Conceptos básicos de TypeScript en Node
8 ejemplos para empezar con TypeScript en Node: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con TypeScript en Node: 6 básicos y 2 intermedios.
npm install -D typescript tsx @types/node."type": "module" en package.json para los ejemplos de ESM a continuación.NodeNext alinea TypeScript con el resolvedor de módulos de Node.
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"skipLibCheck": true,
"outDir": "dist",
"rootDir": "src"
},
"include": ["src"]
}strict habilita strictNullChecks, noImplicitAny y banderas relacionadas juntas.skipLibCheck acelera las compilaciones; aún así verifica los tipos de tu src.outDir/rootDir mantienen dist/ reflejando src/.Relacionado: tsx vs tsc vs ts-node - pipelines de desarrollo vs producción
Los valores de process.env son string | undefined; refínalos antes de usarlos.
const port = Number(process.env.PORT ?? 3000);
if (Number.isNaN(port)) throw new Error('Invalid PORT');?? maneja undefined; la cadena vacía necesita un manejo explícito.@types/node viene con tipados de calidad DefinitelyTyped para las API de Node 24.
import { readFile } from 'node:fs/promises';
import type { Stats } from 'node:fs';
const stat: Stats = await readFile('package.json').then(() => import('node:fs')).then(fs => fs.promises.stat('package.json'));import type para importaciones solo de tipos con verbatimModuleSyntax.@types/node debe coincidir con tu versión principal de Node (npm i -D @types/node@24).node: en el código de la aplicación.TypeScript importa .js porque la emisión mantiene los especificadores sin cambios.
// src/user.ts
export interface User { id: string; name: string }// src/main.ts
import { type User } from './user.js';.ts, pero coincide con la resolución en tiempo de ejecución de Node ESM.moduleResolution: NodeNext impone este patrón.Relacionado: Módulos ES (importación) - reglas de ESM
Los manejadores de Express/Fastify deben devolver void o Promise<void> explícitamente.
import type { Request, Response } from 'express';
export async function getHealth(_req: Request, res: Response): Promise<void> {
res.json({ status: 'ok' });
}any en req y res; define genéricos para body y params.Pruebas nativas con tipos; no se necesita Jest para las pruebas unitarias.
import { test } from 'node:test';
import assert from 'node:assert/strict';
function slugify(input: string): string {
return input.toLowerCase().replace(/\s+/g, '-');
}
test('slugify', () => {
assert.equal(slugify('Hello World'), 'hello-world');
});node --import tsx --test src/**/*.test.ts*.test.ts junto al código fuente o debajo de src/__tests__.assert/strict lanza un error en caso de fallo con diferencias claras.dist/**/*.test.js compilado después de tsc para paridad.strictNullChecks fuerza el manejo de null y undefined.
function findUser(id: string, users: Map<string, { name: string }>): string {
const user = users.get(id);
if (!user) throw new Error(`User ${id} not found`);
return user.name;
}user?.name devuelve string | undefined; aún así refina para la lógica de negocio.! excepto en pruebas o después de guardas explícitas.null deben mapearse a tipos Result o excepciones en los límites.Relacionado: Zod en los límites - validación en tiempo de ejecución
Publica tipos DTO sin componentes internos del servidor.
// packages/types/src/user.ts
export interface UserDto {
id: string;
displayName: string;
}// apps/api/src/handlers/user.ts
import type { UserDto } from '@acme/types/user';
export function toDto(user: { id: string; name: string }): UserDto {
return { id: user.id, displayName: user.name };
}exports en @acme/types/package.json para subrutas.Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026