Saltar al contenido

¿Es TypeScript realmente un superconjunto de JavaScript?

Después de mucho luchar ya encontramos la solución de esta contratiempo que ciertos los usuarios de nuestro sitio presentan. Si tienes algo más que aportar no dudes en compartir tu información.

Solución:

La razón de la existencia de TypeScript es tener un compilador y un lenguaje que pueda aplicar tipos mejor que el Javascript estándar. Cualquier Javascript normal es TypeScript válido, sintácticamente. Eso no significa que el compilador deba 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 código TypeScript, pero es exactamente la razón por la que TypeScript existe y es exactamente el trabajo del compilador señalarle esos problemas.

Él idiomas como tales siguen siendo sub/superconjuntos entre sí.

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

Prueba:

Cuando decimos que el idioma A es un subconjunto del idioma B, queremos decir que todos los programas A válidos también son programas B válidos.

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

let x: number = 3;

Ha identificado un programa JavaScript válido que no es un programa TypeScript válido:

var foo = ;
foo.bar = 42;

Factor de complicación 1: TypeScript es casi un superconjunto. TypeScript está destinado a ser casi un superconjunto de JavaScript. La mayoría de los JS válidos también son TS válidos. Lo que JS no es, por lo general, se puede modificar fácilmente para compilar sin errores en TS. En otras palabras, hay muchos programas en la intersección de estos dos conjuntos (TS válido y JS válido).

Factor de complicación 2: errores no fatales El compilador de TypeScript genera el código JavaScript que desea a veces, incluso si hay errores. El ejemplo al que hice referencia 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 la documentación de 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, TypeScript no válido) por las siguientes razones:

  1. El compilador parece usar el término warning en el sentido convencional, por lo que debemos interpretar error en el sentido convencional también: un error indica que la compilación falló.
  2. El código generado podría no se ejecuta como se esperaba. Podría hacer algo totalmente diferente. Imagine dos idiomas A y B donde cualquier string que compila en A compila en B pero hace algo completamente diferente. No diría que A es un subconjunto de B, aunque lo sea sintácticamente.
  3. La documentación indica que el JavaScript resultante no es necesariamente correcto en cuanto a lo que se pretendía. Una salida incorrecta parece tan mala como (si no peor) que no tener ninguna 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 a cualquier programa TypeScript que genere JavaScript “válido”, entonces tendríamos que llamar válido al siguiente programa TypeScript, porque un punto compila al vacío string después de emitir errores:
.

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 .js Los archivos se pueden compilar con TypeScript. Esto probablemente no es lo que las personas que visitan esta pregunta quieren preguntar.

Creo que complicar el factor 1 es a lo que se refiere Anders Hejlsberg. También podría justificar el marketing engañoso en la página de inicio de TypeScript. Las otras respuestas han sido víctimas del factor de complicación 2. Sin embargo, el consejo general dado en las otras respuestas es correcto: TypeScript es una capa sobre JavaScript diseñada para avisarle cuando hace algo mal. Son diferentes herramientas para diferentes propósitos.

La definición

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

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

Así que es una especie de capa encima de JavaScript. Entonces, por supuesto, la capa subyacente (JavaScript) se puede pasar a través de las capas hasta 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 marco), pero la motocicleta como motor y algunas características mejoradas.

Entonces, puede usar su motocicleta (TypeScript) como una bicicleta (JavaScript), pero no puede usar una bicicleta como motocicleta.

EDITAR:

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

Vea este ejemplo, se compila perfectamente en JavaScript, pero arroja una advertencia.

valoraciones y comentarios

Ten en cuenta dar recomendación a esta sección si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *