Búsqueda de sitios web

Integrando pruebas de tipos en las pruebas unitarias con Typescript


Me he acostumbrado mucho a crear "tests de tipos" en mis proyectos de Typescript que dependen de la tipificación estricta y hago esto usando las utilidades de tipos @type-challenges/utils. Por ejemplo, aquí hay un test que tengo en uno de mis repositorios:

describe("example of a type test", () => {

  it("SetRemoval<TSet, TRemoval>", () => {
    type Set1 = ["foo", "bar", "baz"];
    type Set2 = ["bat-shit-crazy", "never mind"];

    type T1 = SetRemoval<Set1, "foo">;
    type T2 = SetRemoval<Set1, ["foo"]>;
    type T3 = SetRemoval<[...Set1, ...Set2], ["foo", "never mind"]>;    
    
    type cases = [
      Expect<Equal<T1, readonly ["bar", "baz"]>>,
      Expect<Equal<T2, readonly ["bar", "baz"]>>,
      Expect<Equal<T3, readonly ["bar", "baz", "bat-shit-crazy"]>>,
    ];
    const cases: cases = [ true, true, true ];
  });

});

Lo que no es importante es este tipo de utilidad, solo que puedes ver la "forma" de cómo se puede incorporar una prueba del sistema de tipos en un marco de pruebas unitarias tradicional.

Lo grandioso de este tipo de pruebas es que:

  1. los errores de tipo se vuelven inmediatamente visibles en cualquier editor que resalte los errores de tipo
  2. Usar tsc sobre los archivos de prueba se puede utilizar para asegurar que no existan errores de tipo en las pruebas

Hoy utilizo Vitest principalmente para pruebas unitarias, pero antes de eso usaba Jest, Mocha y UVU. La mayoría de estos ejecutores de pruebas ignorarán por completo los errores de tipo y UVU se negaba a ejecutarse si había un error de tipo en cualquier parte del archivo. Ninguna de las dos condiciones es ideal, ya que tus “pruebas de tipo” se resumen como aprobadas o pierdes mucha cobertura de pruebas (es decir, todas las pruebas en un archivo) cada vez que hay un error de tipo.

Lo que me gustaría es la capacidad de simplemente probar la validez de tipo de un "bloque" de código en lugar de un archivo. Estoy seguro de que esto se puede crear y se me conoce por reinventar la rueda de vez en cuando, pero esperando en secreto que alguien conozca alguna herramienta para hacer esto que ya exista en el mundo.