Classes, this types (tipos "this") de Classes, this types (tipos "this")

Dentro de las clases, un tipo especial llamado this hace referencia de forma dinámica a la clase que lo utiliza.

class Caja {
  contenido = "";
  set(valor: string) {
    this.contenido = valor;
    return this;
  }
}

const miCaja: Caja = new Caja();
const valorRetornado = miCaja.set("Joyas");
// const valorRetornado: Caja

El tipo de valorRetornado es inferido por TypeScript a partir de la referencia this que retorna la función set.

También es posible utilizar this como anotación dentro de los parámetros.

class Caja {
  contenido = "";

  constructor(contenido: string) {
    this.contenido = contenido;
  }

  igualQue(otro: this) {
    return otro.contenido === this.contenido;
  }
}

const caja1 = new Caja("joyas");
const caja2 = new Caja("joyas");
const caja3 = new Caja("maquillaje");

console.log(caja1.igualQue(caja2));
console.log(caja1.igualQue(caja3));

Salida…

true
false

Esto es diferente de escribir otro: Caja si se tiene una clase derivada, entonces igualQue solo aceptara instancias derivadas de la misma clase.

class Caja {
  contenido = "";

  igualQue(otro: this) {
    return this.contenido === otraInstancia.contenido;
  }
}

class CajaDerivada extends Caja {
  otroContenido = "";
}

const base = new Caja();
const derivada = new CajaDerivada();
derivada.igualQue(base); // <- base no extiende de derivada, esto generará un error
// Argument of type 'Caja' is not assignable to parameter of type 'CajaDerivada'.