Si bien TypeScript permite declarar tipos primitivos: bool, string, number, int, tambien nos permite crear nuestros propios tipos, lo que hace que TypeScript sea mas potente. Imaginemos que queremos crear nuestros jugadores de futbol

type Jugador={
  name:string,
  position:string,
  age:number
}

ATENTI

Los tipos siembre van en PascalCase, no en minuscula ni en camelCase

Ahora si quisieramos crear un jugador con nuestro tipo podemos hacerlo asi

let mastantuono: Jugador={
	name:"Franco Mastantuono",
	position: "Mediocampista",
	age: 16
}

A su vez, tambien podemos crear funciones que devuelvan nuestro tipo creado

const crearJugador=(name:string, position:string, age:number): Jugador=>{
	return {name, position, age}
}

Propiedades opcionales

Los tipos pueden tener propiedades opcionales, es decir, propiedades que no es necesario que se cumplan para que se cree un nuevo tipo. Supongamos que queremos agregarle el equipo a los jugadores y es posible que algunos jugadores no esten en un club en este momento

type Jugador={
  name:string,
  position:string,
  age:number,
	club?:string
}

Optional chaining

Declarar una variable como opcional tiene una consecuencia lógica. El tipo de dato puede ser el que le digamos o undefined. Si nosotros le damos un valor, tendrá el tipo del valor que le dimos pero si no le damos ningun valor será undefined. Eso significa que cuando sea undefined no podremos hacer muchas cosas, sin embargo cuando no sea queremos que si hagamos algo, como por ejemplo escribir todo el club en mayusculas. Para eso funciona el optional chaining que seria asi

mastantuono.club?.toUppercase()

Propiedades de solo lectura

Algunas veces queremos proteger a los objetos de su mutabilidad. El ejemplo mas comun es cuando no queremos que nadie pueda cambiar el ID de nuestro elemento. Para eso, creemosle un id al tipo Jugador

type Jugador={
	id:number,
  name:string,
  position:string,
  age:number,
	club?:string
}

Ahora, cualquiera podría hacer un mastantuono.id=1213131232 y eso sería valido. Sin embargo, podemos proteger algunas propiedades creandolas como propiedades de solo lectura solamente agregandole el readonly antes de la misma

type Jugador={
	readonly id:number,
  name:string,
  position:string,
  age:number,
	club?:string
}

Template union types