Búsqueda de sitios web

¿Cómo generar verificación de tipos en JavaScript en tiempo de ejecución?


Con TypeScript o Flow (de Facebook) puedo tipar variables de forma estática como

function add (x: integer, y: integer) { ... }

Tanto TypeScript como Flow detectan cualquier invocación ilegal como add('1',0) en tiempo de compilación.

Sin embargo, cuando la biblioteca se compila y se exporta, los tipos desaparecen. Eso significa que el consumidor de la biblioteca que usa esa función no recibe errores, lo que potencialmente puede llevar a problemas difíciles de depurar.

¿Hay alguna manera de generar código adicional automáticamente que arroje exactamente los mismos errores en tiempo de ejecución?

Seguramente puedo colocar manualmente guardias cada vez que se espera una verificación de tipo, pero eso se siente aburrido y repetitivo.

Respuesta #1

https://github.com/codemix/babel-plugin-typecheck hace lo que quieres.

También está https://gcanti.github.io/flowcheck/ pero parece un poco abandonado.

No he usado personalmente ninguna de esas bibliotecas. Parece que podrían cubrir menos del 100% de la sintaxis de Flow.

Respuesta #2

No obtendrás eso solo con JavaScript, sin importar cuál elijas, ya que JavaScript no tiene la noción de tipos en este sentido.

Nunca he trabajado con fb flow, así que no puedo responder sobre eso, pero en cuanto a TypeScript, aquí están las opciones que creo que tienes: (en orden de complejidad y de cuánto no tiene sentido)

  1. Modificar el compilador de TypeScript para agregar automáticamente la validación de parámetros en tiempo de ejecución
    Puedes usar la API del compilador e inyectar un fragmento de código que valide los parámetros de las funciones. El compilador te dirá cuáles son los nombres y tipos de los parámetros, si son opcionales, y así sucesivamente.
    Sólo estoy incluyendo esto como una opción, pero en mi opinión es una solución bastante desordenada.

  2. Comienza cada función con validación
    Bastante parecido al anterior, solo que aquí incluirás el código tú mismo en cada función en lugar de modificar el compilador para que lo haga.
    Puedes tener una función global que tome como argumentos los metadatos de los parámetros declarados y los argumentos reales que se pasan.
    Esto hará que el código quede bastante feo y no será divertido de mantener.

  3. En caso de clases, puedes usar decoradores
    La característica de decoradores es bastante nueva, pero TypeScript te permite usarla, y si quieres hacer esta validación en las clases, entonces esta es la mejor solución para tu problema hasta ahora.

  4. Genera un archivo de definición para tu biblioteca
    Esta es la mejor de las opciones si me preguntas.
    No necesitas contaminar tu código con verificaciones en cada función. Más que eso, nunca puedes controlar quién está usando tu biblioteca o cómo la usan, así que es inútil siquiera intentarlo.
    Para esto, los consumidores de tu biblioteca necesitarán escribir en TypeScript ellos mismos.

Artículos relacionados