Skip to content

GitLab

  • Menu
Projects Groups Snippets
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • E ECMAscript-Typescript
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 11
    • Issues 11
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 0
    • Merge requests 0
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Monitor
    • Monitor
    • Metrics
    • Incidents
  • Packages & Registries
    • Packages & Registries
    • Package Registry
    • Infrastructure Registry
  • Analytics
    • Analytics
    • CI/CD
    • Repository
    • Value stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • imunnic
  • ECMAscript-Typescript
  • Wiki
  • Modulo 2

Modulo 2 · Changes

Page history
adaptacion sin revision a typescript authored Dec 15, 2025 by imunnic's avatar imunnic
Hide whitespace changes
Inline Side-by-side
Showing with 101 additions and 118 deletions
+101 -118
  • Modulo-2.md Modulo-2.md +101 -118
  • No files found.
Modulo-2.md
View page @ bd3be2ea
# Módulo 2 — Importación de elementos en JavaScript (Adaptado a tu API) # Módulo 2 — Importación de elementos en TypeScript
## 1. Importación de datos ## 1. Importación de datos
En JavaScript es posible importar datos (constantes, variables, objetos o listas) definidos en otros archivos, o bien cargarlos desde archivos JSON externos. TypeScript utiliza el **sistema de módulos ES** igual que JavaScript, pero añade **tipado explícito**, lo que permite validar la estructura de los datos en tiempo de desarrollo.
Esto permite mantener la información organizada y separada de la lógica del programa.
En este módulo, los ejemplos se adaptan a la estructura real de tu API: recursos humanos, recursos materiales y activaciones. En este módulo los ejemplos se adaptan a la estructura real de tu API: **recursos humanos, recursos materiales y activaciones**.
--- ---
### Ejemplo: Importación desde otro archivo JavaScript ### Ejemplo: Importación desde otro archivo TypeScript
Archivo `data/recursos.js`: Archivo `data/recursos.ts`:
```js ```ts
// data/recursos.js // data/recursos.ts
export const recursosHumanos = [ export type TipoRecurso = 'Humano' | 'Material';
export interface RecursoBase {
id: number;
nombreRecurso: string;
tipoRecurso: TipoRecurso;
unidad: string;
comunidadAutonoma: string;
provincia: string;
localidad: string;
base: string;
servicioMedicoReferencia?: string; // opcional
}
export const recursosHumanos: RecursoBase[] = [
{ {
id: 1, id: 1,
nombreRecurso: 'Laura Gómez', nombreRecurso: 'Laura Gómez',
...@@ -35,12 +48,12 @@ export const recursosHumanos = [ ...@@ -35,12 +48,12 @@ export const recursosHumanos = [
comunidadAutonoma: 'Madrid', comunidadAutonoma: 'Madrid',
provincia: 'Madrid', provincia: 'Madrid',
localidad: 'Pozuelo de Alarcón', localidad: 'Pozuelo de Alarcón',
base: 'General Cavalcanti.', base: 'General Cavalcanti',
servicioMedicoReferencia: 'Hospital Infanta Sofía', servicioMedicoReferencia: 'Hospital Infanta Sofía',
}, },
]; ];
export const recursosMateriales = [ export const recursosMateriales: RecursoBase[] = [
{ {
id: 10, id: 10,
nombreRecurso: 'ET 117928', nombreRecurso: 'ET 117928',
...@@ -64,40 +77,30 @@ export const recursosMateriales = [ ...@@ -64,40 +77,30 @@ export const recursosMateriales = [
]; ];
``` ```
Archivo `gestion/mostrarRecursos.js`: Archivo `gestion/mostrarRecursos.ts`:
```js ```ts
// gestion/mostrarRecursos.js // gestion/mostrarRecursos.ts
import { recursosHumanos, recursosMateriales } from '../data/recursos.js'; import { recursosHumanos, recursosMateriales, RecursoBase } from '../data/recursos';
console.log('Listado de recursos humanos:'); console.log('Listado de recursos humanos:');
recursosHumanos.forEach((r) => { recursosHumanos.forEach((r: RecursoBase) => {
console.log(`- ${r.nombreRecurso} (${r.unidad})`); console.log(`- ${r.nombreRecurso} (${r.unidad})`);
}); });
console.log('\nListado de recursos materiales:'); console.log('\nListado de recursos materiales:');
recursosMateriales.forEach((r) => { recursosMateriales.forEach((r: RecursoBase) => {
console.log(`- ${r.nombreRecurso} [${r.base}]`); console.log(`- ${r.nombreRecurso} [${r.base}]`);
}); });
``` ```
**Salida esperada:**
```
Listado de recursos humanos:
- Laura Gómez (AGRUSAN)
- Javier Ruiz (NAS 11)
Listado de recursos materiales:
- ET 117928 [General Cavalcanti]
- ET 117929 [General Cavalcanti]
```
--- ---
### Ejemplo: Importación desde un archivo JSON usando fetch() ### Ejemplo: Importación desde un archivo JSON
Archivo `data/activaciones.json`: En TypeScript, los datos JSON suelen mapearse a **interfaces**.
Archivo `data/activaciones.json` (sin cambios):
```json ```json
[ [
...@@ -109,24 +112,32 @@ Archivo `data/activaciones.json`: ...@@ -109,24 +112,32 @@ Archivo `data/activaciones.json`:
"tipoJornada": "COMPLETA", "tipoJornada": "COMPLETA",
"tipoSituacion": "ACTIVIDAD", "tipoSituacion": "ACTIVIDAD",
"observaciones": "Servicio programado" "observaciones": "Servicio programado"
},
{
"id": 101,
"recursoId": 10,
"fechaHoraInicio": "2025-01-05T09:30:00",
"fechaHoraFin": "2025-01-05T12:00:00",
"tipoJornada": "PARCIAL",
"tipoSituacion": "NO_OPERATIVO",
"observaciones": "Revisión mecánica"
} }
] ]
``` ```
Archivo `gestion/activaciones.js`: Archivo `models/Activacion.ts`:
```ts
// models/Activacion.ts
export interface Activacion {
id: number;
recursoId: number;
fechaHoraInicio: string;
fechaHoraFin: string;
tipoJornada: 'COMPLETA' | 'PARCIAL';
tipoSituacion: 'ACTIVIDAD' | 'NO_OPERATIVO';
observaciones?: string;
}
```
Archivo `gestion/activaciones.ts`:
```js ```ts
// gestion/activaciones.js // gestion/activaciones.ts
async function cargarActivaciones() { import { Activacion } from '../models/Activacion';
async function cargarActivaciones(): Promise<void> {
try { try {
const respuesta = await fetch('../data/activaciones.json'); const respuesta = await fetch('../data/activaciones.json');
...@@ -134,45 +145,33 @@ async function cargarActivaciones() { ...@@ -134,45 +145,33 @@ async function cargarActivaciones() {
throw new Error(`Error al cargar los datos: ${respuesta.status}`); throw new Error(`Error al cargar los datos: ${respuesta.status}`);
} }
const activaciones = await respuesta.json(); const activaciones: Activacion[] = await respuesta.json();
console.log('Activaciones registradas:'); console.log('Activaciones registradas:');
activaciones.forEach((a) => { activaciones.forEach((a: Activacion) => {
console.log( console.log(`- Activación #${a.id}: recurso ${a.recursoId} (${a.tipoSituacion}, ${a.tipoJornada})`);
`- Activación #${a.id}: recurso ${a.recursoId} ` + `(${a.tipoSituacion}, ${a.tipoJornada})`
);
}); });
} catch (error) { } catch (error) {
console.error('No se pudieron cargar las activaciones:', error.message); console.error('No se pudieron cargar las activaciones', error);
} }
} }
cargarActivaciones(); cargarActivaciones();
``` ```
**Salida esperada:**
```
Activaciones registradas:
- Activación #100: recurso 1 (ACTIVIDAD, COMPLETA)
- Activación #101: recurso 10 (NO_OPERATIVO, PARCIAL)
```
--- ---
## 2. Importación de funciones ## 2. Importación de funciones
Ejemplo adaptado a métricas reales: porcentaje de recursos en situación de actividad. Archivo `utils/calculos.ts`:
Archivo `utils/calculos.js`:
```js ```ts
// utils/calculos.js // utils/calculos.ts
export function calcularPorcentajeActividad(total, enActividad) { export function calcularPorcentajeActividad(total: number, enActividad: number): string {
return ((enActividad / total) * 100).toFixed(1); return ((enActividad / total) * 100).toFixed(1);
} }
export function formatearSituacion(situacion) { export function formatearSituacion(situacion: string): string {
return situacion return situacion
.toLowerCase() .toLowerCase()
.replace('_', ' ') .replace('_', ' ')
...@@ -180,63 +179,53 @@ export function formatearSituacion(situacion) { ...@@ -180,63 +179,53 @@ export function formatearSituacion(situacion) {
} }
``` ```
Archivo `reportes/actividadRecursos.js`: Archivo `reportes/actividadRecursos.ts`:
```js ```ts
// reportes/actividadRecursos.js // reportes/actividadRecursos.ts
import { calcularPorcentajeActividad, formatearSituacion } from '../utils/calculos.js'; import { calcularPorcentajeActividad, formatearSituacion } from '../utils/calculos';
const totalRecursos = 20; const totalRecursos: number = 20;
const recursosActivos = 15; const recursosActivos: number = 15;
console.log( console.log(
`Porcentaje de recursos en ACTIVIDAD: ` + `Porcentaje de recursos en ACTIVIDAD: ${calcularPorcentajeActividad(totalRecursos, recursosActivos)}%`
`${calcularPorcentajeActividad(totalRecursos, recursosActivos)}%`
); );
console.log(`Situación formateada: ${formatearSituacion('BAJA_MEDICA')}`); console.log(`Situación formateada: ${formatearSituacion('BAJA_MEDICA')}`);
``` ```
**Salida esperada:**
```
Porcentaje de recursos en ACTIVIDAD: 75.0%
Situación formateada: Baja medica
```
--- ---
## 3. Importación de clases ## 3. Importación de clases
Aquí adaptamos el ejemplo a tu modelo real: `Recurso` es abstracto, así que podemos crear una clase `RecursoHumanoJS` que emula la estructura de tu API en front. Archivo `models/RecursoHumano.ts`:
Archivo `models/RecursoHumano.js`: ```ts
// models/RecursoHumano.ts
```js
// models/RecursoHumano.js
export class RecursoHumano { export class RecursoHumano {
constructor(id, nombreRecurso, unidad, tipoSituacion) { constructor(
this.id = id; public id: number,
this.nombreRecurso = nombreRecurso; public nombreRecurso: string,
this.unidad = unidad; public unidad: string,
this.tipoRecurso = 'Humano'; public tipoSituacion: string
this.tipoSituacion = tipoSituacion; ) {}
}
mostrarFicha() { readonly tipoRecurso: string = 'Humano';
mostrarFicha(): void {
console.log( console.log(
`Recurso Humano #${this.id}: ${this.nombreRecurso} ` + `Recurso Humano #${this.id}: ${this.nombreRecurso} - Unidad: ${this.unidad} (${this.tipoSituacion})`
`- Unidad: ${this.unidad} (${this.tipoSituacion})`
); );
} }
} }
``` ```
Archivo `gestion/personal.js`: Archivo `gestion/personal.ts`:
```js ```ts
// gestion/personal.js // gestion/personal.ts
import { RecursoHumano } from '../models/RecursoHumano.js'; import { RecursoHumano } from '../models/RecursoHumano';
const tecnico = new RecursoHumano(1, 'Laura Gómez', 'AGRUSAN', 'ACTIVIDAD'); const tecnico = new RecursoHumano(1, 'Laura Gómez', 'AGRUSAN', 'ACTIVIDAD');
const medico = new RecursoHumano(2, 'Javier Ruiz', 'NAS 11', 'COMISION_SERVICIO'); const medico = new RecursoHumano(2, 'Javier Ruiz', 'NAS 11', 'COMISION_SERVICIO');
...@@ -245,34 +234,28 @@ tecnico.mostrarFicha(); ...@@ -245,34 +234,28 @@ tecnico.mostrarFicha();
medico.mostrarFicha(); medico.mostrarFicha();
``` ```
**Salida esperada:**
```
Recurso Humano #1: Laura Gómez - Unidad: AGRUSAN (ACTIVIDAD)
Recurso Humano #2: Javier Ruiz - Unidad: NAS 11 (COMISION_SERVICIO)
```
--- ---
## 4. Buenas prácticas ## 4. Buenas prácticas en TypeScript
- Usar rutas relativas (`./` o `../`) para importar módulos locales. * Evitar `any`; usar `interface` o `type`.
- Incluir siempre la extensión `.js` en los módulos. * No es necesario indicar la extensión `.ts` en los imports.
- Organizar el proyecto en carpetas como `/data`, `/utils` y `/models`. * Usar **barrel files** (`index.ts`) para agrupar exports.
- Usar `export default` cuando el módulo exporta un único elemento. * Separar modelos (`/models`), utilidades (`/utils`) y lógica (`/gestion`).
Ejemplo adaptado al dominio: Ejemplo con exportación por defecto:
```js ```ts
// utils/logger.js // utils/logger.ts
export default function log(mensaje) { export default function log(mensaje: string): void {
console.log(`[Sistema Recursos]: ${mensaje}`); console.log(`[Sistema Recursos]: ${mensaje}`);
} }
``` ```
```js ```ts
// main.js // main.ts
import log from './utils/logger.js'; import log from './utils/logger';
log('Sistema de activaciones inicializado.'); log('Sistema de activaciones inicializado.');
``` ```
Clone repository

Índice

  • Inicio
  • Modulo 1. Sitaxis básica
  • Modulo 2. Importaciones en Javascript
  • Modulo 3. Interacción con el BOM y con el DOM
  • Modulo 4. Uso de servicios y API REST