Laboratorio: Implementación de POO en TypeScript

Objetivo

Implementar conceptos de Programación Orientada a Objetos (POO) en una aplicación web utilizando TypeScript. Requisitos Previos

  • Node.js y npm instalados

Paso 1: Instalación de TypeScript

  • Inicializar un proyecto Node.js:
mkdir poo-typescript
cd poo-typescript
npm init -y

Con los comandos anteriores se crea un nuevo proyecto Node.js con un archivo package.json predeterminado.

Instalar TypeScript:

npm install typescript --save-dev

Con el comando anterior, se instala TypeScript como una dependencia de desarrollo en el proyecto.

Crear el archivo de configuración tsconfig.json:

npx tsc --init

Este comando crea un archivo tsconfig.json con la configuración predeterminada para TypeScript.

Estructura del Proyecto:

/poo-typescript
├── src
│   ├── encapsulamiento.ts
│   ├── herencia.ts
│   ├── polimorfismo.ts
│   └── main.ts
└── tsconfig.json

En la estructura del proyecto, src contendrá los archivos TypeScript con ejemplos de encapsulamiento, herencia y polimorfismo, y main.ts será el archivo principal para ejecutar los ejemplos.

Paso 2: Definición de Clases y Encapsulamiento

  • Crear una clase Persona en src/encapsulamiento.ts:

  • Agregar métodos para obtener y establecer propiedades privadas en Persona:

// src/encapsulamiento.ts

class Persona {
    private nombre: string;
    private edad: number;

    constructor(nombre: string, edad: number) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public getNombre(): string {
        return this.nombre;
    }

    public getEdad(): number {
        return this.edad;
    }

    public setNombre(nombre: string): void {
        this.nombre = nombre;
    }

    public setEdad(edad: number): void {
        this.edad = edad;
    }
}

export { Persona };

En el código anterior se define una clase Persona con propiedades privadas nombre y edad, y métodos para obtener y establecer los valores de estas propiedades.

Paso 3: Herencia

  • Crear una clase Estudiante que herede de Persona en src/herencia.ts:
// src/herencia.ts

import { Persona } from './encapsulamiento';

class Estudiante extends Persona {
    private matricula: string;

    constructor(nombre: string, edad: number, matricula: string) {
        super(nombre, edad);
        this.matricula = matricula;
    }

    public getMatricula(): string {
        return this.matricula;
    }

    public setMatricula(matricula: string): void {
        this.matricula = matricula;
    }
}

export { Estudiante };

En el código anterior se define una clase Estudiante que hereda de Persona y agrega una propiedad matricula con métodos para obtener y establecer su valor.

Paso 4: Polimorfismo

  • Crear una clase Profesor y una función para demostrar polimorfismo en src/polimorfismo.ts:
// src/polimorfismo.ts

import { Persona } from './encapsulamiento';

class Profesor extends Persona {
    private materia: string;

    constructor(nombre: string, edad: number, materia: string) {
        super(nombre, edad);
        this.materia = materia;
    }

    public getMateria(): string {
        return this.materia;
    }

    public setMateria(materia: string): void {
        this.materia = materia;
    }

    public presentar(): string {
        return `Soy el profesor ${this.getNombre()} y enseño ${this.materia}.`;
    }
}

class Estudiante extends Persona {
    private matricula: string;

    constructor(nombre: string, edad: number, matricula: string) {
        super(nombre, edad);
        this.matricula = matricula;
    }

    public getMatricula(): string {
        return this.matricula;
    }

    public setMatricula(matricula: string): void {
        this.matricula = matricula;
    }

    public presentar(): string {
        return `Soy el estudiante ${this.getNombre()} y mi matrícula es ${this.matricula}.`;
    }
}

function presentarPersona(persona: Persona): string {
    if (persona instanceof Profesor) {
        return persona.presentar();
    } else if (persona instanceof Estudiante) {
        return persona.presentar();
    } else {
        return `Soy ${persona.getNombre()} y tengo ${persona.getEdad()} años.`;
    }
}

export { Profesor, Estudiante, presentarPersona };

En el código anterior se define una clase Profesor que hereda de Persona y agrega una propiedad materia con métodos para obtener y establecer su valor, y un método presentar para mostrar información específica del profesor. También se define una función presentarPersona que demuestra polimorfismo al presentar a una persona como profesor, estudiante o persona genérica.

Paso 5: Implementación en el Archivo Principal

  • Crear el archivo principal src/main.ts para ejecutar ejemplos:
// src/main.ts

import { Persona } from './encapsulamiento';
import { Estudiante } from './herencia';
import { Profesor, presentarPersona } from './polimorfismo';

const persona = new Persona('Carlos', 30);
console.log(`Persona: ${persona.getNombre()}, ${persona.getEdad()} años`);

const estudiante = new Estudiante('Ana', 22, '2022001');
console.log(`Estudiante: ${estudiante.getNombre()}, ${estudiante.getEdad()} años, Matrícula: ${estudiante.getMatricula()}`);

const profesor = new Profesor('Luis', 40, 'Matemáticas');
console.log(`Profesor: ${profesor.getNombre()}, ${profesor.getEdad()} años, Materia: ${profesor.getMateria()}`);

console.log(presentarPersona(persona));
console.log(presentarPersona(estudiante));
console.log(presentarPersona(profesor));

En el código anterior se crean instancias de Persona, Estudiante y Profesor, y se muestra información sobre cada uno de ellos. También se llama a la función presentarPersona para mostrar información polimórfica sobre las personas.

Paso 6: Compilar y Ejecutar

  • Compilar el proyecto:
npx tsc

Ejecutar el archivo JavaScript generado:

node src/main.js

Conclusiones

En este laboratorio, se ha implementado la Programación Orientada a Objetos (POO) en una aplicación web utilizando TypeScript. Se han definido clases con propiedades y métodos, se ha demostrado el encapsulamiento, la herencia y el polimorfismo, y se ha ejecutado un ejemplo para mostrar el funcionamiento de estos conceptos en TypeScript.

Reto

Extiende la aplicación con más clases y métodos que demuestren otros conceptos de POO, como abstracción, interfaces, métodos estáticos, etc.