Las interfaces en TypeScript es una muy buena forma de definir el contrato de nuestros objetos, es decir, que forma y que metodos van a tener. En su estructura es muy parecido a los tipos personalizados

interface Jugador{
  id:number
  name:string,
  club:string
}

Podemos agregarle también metodos, como hemos dicho arriba

interface Jugador{
  id:number
  name:string,
  club:string,
	saludar:()=>void
}

A la hora de crear un jugador, sería asi

const borja:Jugador={
  id:1,
  name:"Miguel Borja",
  club:"River Plate",
  saludar:()=>{
    console.log(borja.name)
  }
}

Anidacion de interfaces

Las interfaces se pueden anidar para crear cada vez interfaces mas grandes. Veamos el siguiente ejemplo con un producto

interface Producto{
  id:number,
  name:string,
  precio:number
}

Ahora queremos integrar un carrito de compras que contenga productos

interface CarritoCompras{
	id:number,
	total:number,
	productos:Producto[]
}

Extender interfaces

Volvamos al ejemplo de los productos. Todos los productos van a tener esas caracteristicas pero algunos tendran otras mas especificas, por ejemplo pensando en una tienda de componentes de computacion habrá otra interfaz llamada PlacaVideo para las placas de video, pero que comparten los elementos de la interfaz Producto. Lo que se puede hacer en este caso es extender la interfaz para sumar los elementos de las dos interfaces.

interface PlacaVideo extends Producto{
	marca:string,
	modelo:string,
	año:number
}

Para poder instanciar una placa de video deberiamos llenar todos los datos, como este ejemplo

const placa1: PlacaVideo={
  id:1,
  marca:"Nvidia",
  modelo:"RTX 2060",
  año:2021,
  precio:250000,
  name:"Placa de Video Nvidia RTX 2060"
}

Funciones en las interfaces

Para poder agregarle metodos a las interfaces en formato de funciones debemos indicarle que tipo de parametros reciben y cual será el tipo del retorno. Por ejemplo, supongamos que queremos crear una interfaz para todas las operaciones que puede haber en un carrito de compras

interface CarritoOps{
	agregar:(producto: Producto)=>void
	eliminarCarrito:()=>void
}