lenguaje diferencias desventajas javascript compiler-errors typescript1.4

diferencias - typescript vs javascript



¿Es TypeScript realmente un superconjunto de JavaScript? (3)

Acabo de comenzar a usar TypeScript y, a veces, obtengo errores del compilador "uso de variable no declarada". Por ejemplo los siguientes trabajos en JavaScript plano:

var foo = {}; foo.bar = 42;

Si intento hacer lo mismo en TypeScript, no funcionará y dame el error mencionado anteriormente. Tengo que escribirlo así:

var foo :any = {}; foo.bar = 42;

En JavaScript simple, la definición de tipo con cualquiera no es necesaria ni válida, pero en TypeScript parece ser obligatoria. Entiendo el error y el motivo, pero siempre escuché en los Videos y leí la documentación:

typescriptlang.org :

"TypeScript es un superconjunto mecanografiado de JavaScript [...]"

Video introductorio @minute 3:20 :

"Todo el código JavaScript es código TypeScript, simplemente copie y pegue"

¿Es eso algo que cambió durante el desarrollo de TypeScript o tengo que pasar una configuración específica del compilador para que esto funcione?


La definición

"Todo el código JavaScript es código TypeScript, simplemente copie y pegue"

es verdad. Porque cualquier código JavaScript puede pasar al compilador de TypeScript.

Así que es una especie de capa sobre JavaScript. Entonces, por supuesto, la capa subyacente (JavaScript) se puede pasar a través de las capas a la parte superior (TypeScript), pero no al revés.

Por qué no?

Piense en ello como una bicicleta (JavaScript) y una motocicleta (TypeScript). Los conceptos básicos son los mismos (dos ruedas, un cuadro), pero la motocicleta como motor y algunas características mejoradas.

Por lo tanto, puede usar su motocicleta (TypeScript) como una bicicleta (JavaScript), pero no puede usar una bicicleta como una motocicleta.

EDITAR:

Si su compilador lanza una advertencia, ¿por qué hace la declaración errónea? Simplemente dice: Oye, estás usando TypeScript, y es más estricto que lo que me diste.

Mira este ejemplo , compila perfectamente a JavaScript, pero lanza una advertencia.


La razón de la existencia de TypeScript es tener un compilador y un lenguaje que pueda imponer tipos mejor que el Javascript de vainilla. Cualquier Javascript regular es válido para TypeScript, sintácticamente . Eso no significa que el compilador debe estar completamente satisfecho con él. Vanilla Javascript a menudo contiene código que es problemático en términos de seguridad de tipo. Eso no lo hace inválido el código de TypeScript, pero es exactamente la razón por la que existe TypeScript y es exactamente el trabajo del compilador señalarle esos problemas.

Los lenguajes como tales son todavía sub / superconjuntos el uno del otro.


Teorema: TypeScript no es un subconjunto ni un superconjunto de JavaScript.

Prueba:

Cuando decimos que el lenguaje A es un subconjunto del lenguaje B, nos referimos a que todos los programas A válidos también son programas B válidos.

Aquí hay un programa válido de TypeScript que no es un programa válido de JavaScript:

let x: number = 3;

Identificó un programa de JavaScript válido que no es un programa de TypeScript válido:

var foo = {}; foo.bar = 42;

Factor de complicación 1: TypeScript es casi un superconjunto . TypeScript está destinado a ser un superconjunto de JavaScript. La mayoría de los JS válidos también son TS válidos. Lo que no es JS generalmente se puede ajustar fácilmente para compilar sin errores en TS.

Factor de complicación 2: errores no fatales El compilador de TypeScript genera el código de JavaScript que intenta a veces, incluso si hay errores. El ejemplo que mencioné anteriormente emite este error.

error TS2339: Property ''bar'' does not exist on type ''{}''.

pero también este código JS

var foo = {}; foo.bar = 42;

Las notas de documentación del TS.

Puede usar TypeScript incluso si hay errores en su código. Pero en este caso, TypeScript advierte que es probable que su código no se ejecute como se esperaba.

Creo que podemos llamar a esto una compilación fallida (y, por lo tanto, un TypeScript no válido) por las siguientes razones:

  1. El compilador parece usar el término warning en el sentido convencional, por lo que también debemos interpretar el error en el sentido convencional: un error indica que la compilación ha fallado.
  2. El código generado no se pudo ejecutar como se esperaba. Podría hacer algo totalmente diferente. Imagine dos idiomas A y B donde cualquier cadena que se compile en A se compile en B pero haga algo completamente diferente. No diría que A es un subconjunto de B, aunque sea sintácticamente.
  3. La documentación indica que el JavaScript resultante es incorrecto en cuanto a lo que se pretendía. Una salida incorrecta parece tan mala como (si no es peor que) sin salida. Ambos deben considerarse fallidos.
  4. El compilador de TypeScript sale con el código de estado 2, que convencionalmente indica que el proceso falló de alguna manera.
  5. Si llamamos "válido" a cualquier programa TypeScript que genere JavaScript, entonces deberíamos llamar válido al siguiente programa TypeScript:

"

Factor de complicación 3: TS acepta archivos JS: el compilador de TypeScript puede pasar archivos que terminan en .js (consulte la documentación del compilador para --allowJs ). En este sentido, TypeScript es un superconjunto de JS. Todos los archivos .js se pueden compilar con TypeScript. Probablemente, esto no es lo que las personas que visitan esta pregunta quieren preguntar.

Creo que el factor de complicación 1 es lo que Anders Hejlsberg está tratando de resolver. También podría justificar el marketing engañoso en la página de inicio de TypeScript. Las otras respuestas han sido presa del factor 2 que complica la complicación. Sin embargo, el consejo general dado en las otras respuestas es correcto: TypeScript es una capa sobre JavaScript diseñada para decirle cuándo hace algo malo. Son herramientas diferentes para diferentes propósitos.