# Clases en TypeScript

class Avengers {
	nombre: string;
	equipo: string;
	nombreReal: string;
	puedePelear: boolean;
	peleasGanadas: numbe;
}

let atman: Avengers = new Avengers();

# Static

Atributos y metodos estaticos

NOTA

Para utilizar estos metodos no se necesita instanciar la clase NombreClase.metodoEstatico()

Clase con un metodo estatico

class Curso = {
   constructor(private id: number, private nombre: string){}

   static getInfo(curso: Curso): string {
      return JSON.stringify(curso)
   }
}
class Escuela = {
  private nombre: string
  private cursos: Curso[]

  constructor(nombre: string) {
    this.nombre = nombre
				this.cursos = []
  }

  agregarCurso(curso: Curso): void{
    this.cursos.push(curso)
  }

}
let escuela: Escuela
escuela = new Escuela('Escuela de Programación')

const TS = new Curso( 1, 'TypeScript'))

Utilizamos el metodo sin la necesidad de instanciar la clase

console.log(Curso.getInfo(TS));

# Clases abstractas

Las clases abtractas te permiten definir un modelo de datos pero no podran ser Instanciadas.
Si se crea un metodo abstracto autoamicamente la clase tendra que ser abstracta.
Los metodos abstractos solo se define, luego en la clase que hereda es cuando se implementa la funcionalidad necesaria.

Son utilizadas con extends nombreClase

abstract class Escuela = {
   constructor(protected _id: number, protected _nombre: string, protected cursos: Curso){

   }

   abstract public empezarCurso(curso: Curso): void
}
class EscuelaProgramacion extend Escuela = {
   constructor(nombre: string, paginaWeb: string){
      super(nombre)
   }

   public empezarCurso(curso: Curso) {
      console.log(`${this._nombre} ${this.paginaWeb}`)
   }
}

let escuela: EscuelaProgramacion
escuela = new EscuelaProgramacion('EProg', 'ep.com')

const angular = new Curso(3, 'Angular')
escuela.empezarCurso(angular)

# Interfaces

Para definir una estructura para un objetos, clases, funciones.

Son utilizadas con implements nombreClase

Interface Objetos

interface Xmen {
	nombre: string;
	poder: string;

	regenerar(nombreReal: string): void;
}

function enviarMision(xmen: Xmen) {
	console.log(`Enviando a ${xmen.nombre}`);

	xmen.regenerar(xmen.nombre);
}

let worverine: Xmen = {
	nombre: 'Cindy',
	poder: 'Aprender',

	regenerar(nombreReal: string) {
		console.log(`Se ha regenerado ${nombreReal}`);
	},
};

enviarMision(worverine);

# Interface functions

interface DosNumerosFunc {
	(num1: number, num2: number): number;
}

let sumar: DosNumerosFunc;

sumar = (num1: number, num2: number) => num1 + num2;
console.log(sumar(8, 7));

let restar: DosNumerosFunc;

sumar = (num1: number, num2: number) => num1 - num2;
console.log(sumar(12, 6));

# Constructor privados

Se utiliza cuando quieres que no exista mas de una instancia de una clase

# Constructor Genericos

Para los genericos por convencion se utiliza con una <T> luego al parametro:T

function regresar<T>(arg: T) {
	return arg;
}

console.log(regresar(15.456789).toFixed(2));
console.log(regresar('alejandro').toUpperCase());
  • Genericos en funciones
function funcionGenerica<T>(args: T) {
	return args;
}

type Heroe = {
	nombre: string,
	poder: string,
};

type Villano = {
	nombre: string,
	nombreReal: string,
	poder: string,
};

let deadpool = {
	nombre: 'Deadpool',
	nombreReal: 'Wade Wiston',
	poder: 'Recuperacion',
};

console.log(funcionGenerica < Villano > deadpool);
  • Genericos en Array
let heroesArray: Array<string> = ['Alejandro', 'Cindy'];

// Lo mismo que esto
let villanos: String[] = ['Perrro malo', 'Gato malo'];

# Clases Genericas

class Cuadrado< T extends number | string > {
   base: T;
   altura: T;

   area(): number {
      return this.base * this.altura;
   }
}

let cuadrado = new Cuadrado<number | string>();

cuadrado.base = 10;
cuadrado.altura = 10;
console.log(cuadrado.area());