Con TypeScript o el flujo de Facebook (tipo) puedo escribir estáticamente variables 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 exporta, los tipos desaparecen. Eso significa que el consumidor de la biblioteca que usa esa función no obtiene errores, lo que puede conducir a problemas difíciles de depurar.

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

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

3
Dmitri Zaitsev 13 may. 2016 a las 15:11

3 respuestas

La mejor respuesta

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

También hay 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.

3
Nikita 13 may. 2016 a las 19:28

No obtendrá eso solo de javascript, independientemente de cuál elija, 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 aquí están las opciones que creo que tiene: (en orden de complejidad y cuánto no tiene sentido)

  1. Modifique el compilador de mecanografía para agregar automáticamente la validación de parámetros de tiempo de ejecución
    Puede usar la API del compilador e inyectar un fragmento de código que validar los params para las funciones. El compilador le dirá cuáles son los nombres y tipos de parámetros, si son opcionales, etc.
    Solo estoy incluyendo esto como una opción, pero en mi opinión es una solución bastante desordenada.

  2. Inicie todas las funciones con validación
    Muy parecido al anterior, solo que incluirá el código usted mismo en cada función en lugar de modificar el compilador para hacerlo.
    Puede 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 las cosas sean bastante feas en cuanto al código, y no será divertido de mantener.

  3. En el caso de las clases, puede usar decoradores
    La función de decoradores es bastante nueva, pero typecript te permite usarla, y si desea hacer esto en las clases de validación, esta es la mejor solución para su problema hasta ahora.

  4. Genere un archivo de definición para su biblioteca
    Esta es la mejor opción si me preguntas.
    No necesita contaminar su código con controles en cada función. Más que eso, nunca puedes controlar quién está usando tu lib o cómo la usan, por lo que es una causa perdida incluso intentarlo.
    Para esto, sus consumidores de librerías deberán escribir ellos mismos en mecanografiado.

1
Nitzan Tomer 13 may. 2016 a las 16:22

También puede probar babel-plugin-runtyper que realiza la verificación de tipos en tiempo de ejecución y no requieren anotaciones manuales.
Para su ejemplo, si la función se ve así:

function add(x, y) {
   return x + y;
}

Y lo llamas como

add('1', 0);

Recibirás una advertencia en la consola:

Operación plus con diferentes tipos: "1" (cadena) + 0 (número)

1
vitalets 1 abr. 2017 a las 08:06