TypeScript es un lenguaje de programación de alto nivel, gratuito y de código abierto desarrollado por Microsoft que agrega tipado estático con anotaciones de tipo opcionales a JavaScript . Está diseñado para el desarrollo de aplicaciones grandes y se transpila a JavaScript. [6] Debido a que TypeScript es un superconjunto de JavaScript, todos los programas JavaScript son TypeScript sintácticamente válidos, pero pueden fallar en la verificación de tipo por razones de seguridad .
TypeScript se puede utilizar para desarrollar aplicaciones JavaScript tanto para ejecución del lado del cliente como del lado del servidor (como con Node.js , Deno o Bun ). Hay múltiples opciones disponibles para la transpilación. Se puede utilizar el compilador TypeScript predeterminado [7] o se puede invocar el compilador Babel para convertir TypeScript a JavaScript.
TypeScript admite archivos de definición que pueden contener información de tipo de bibliotecas JavaScript existentes , de forma similar a como los archivos de encabezado de C++ pueden describir la estructura de los archivos de objetos existentes . Esto permite que otros programas utilicen los valores definidos en los archivos como si fueran entidades TypeScript tipadas estáticamente. Existen archivos de encabezado de terceros para bibliotecas populares como jQuery , MongoDB y D3.js. Los encabezados TypeScript para los módulos de la biblioteca Node.js también están disponibles, lo que permite el desarrollo de programas Node.js dentro de TypeScript. [8]
El compilador TypeScript está escrito en TypeScript y compilado en JavaScript. Tiene licencia Apache License 2.0 . Anders Hejlsberg , arquitecto principal de C# y creador de Delphi y Turbo Pascal , ha trabajado en el desarrollo de TypeScript. [9] [10] [11] [12]
TypeScript fue lanzado al público en octubre de 2012, con la versión 0.8, después de dos años de desarrollo interno en Microsoft. [13] [14] Poco después del lanzamiento público inicial, Miguel de Icaza elogió el lenguaje en sí, pero criticó la falta de soporte de IDE maduros aparte de Microsoft Visual Studio , que no estaba disponible en Linux y macOS en ese momento. [15] [16] A partir de abril de 2021 hay soporte en otros IDE y editores de texto, incluidos Emacs , Vim , WebStorm , Atom [17] y el propio Visual Studio Code de Microsoft . [18] TypeScript 0.9, lanzado en 2013, agregó soporte para genéricos . [19]
TypeScript 1.0 se lanzó en la conferencia de desarrolladores Build de Microsoft en 2014. [20] Visual Studio 2013 Update 2 proporcionó soporte integrado para TypeScript. [21] Se realizaron más mejoras en julio de 2014, cuando el equipo de desarrollo anunció un nuevo compilador de TypeScript, que se afirma que tiene un aumento de rendimiento de cinco veces. Simultáneamente, el código fuente, que inicialmente estaba alojado en CodePlex , se trasladó a GitHub . [22]
El 22 de septiembre de 2016, se lanzó TypeScript 2.0, que introdujo varias características, incluida la capacidad de los programadores de aplicar opcionalmente la seguridad nula , [23] para mitigar lo que a veces se conoce como el error de los mil millones de dólares .
TypeScript 3.0 se lanzó el 30 de julio de 2018, [24] incorporando muchas novedades al lenguaje, como tuplas en parámetros de descanso y expresiones extendidas, parámetros de descanso con tipos de tuplas, parámetros de descanso genéricos, etc. [25]
TypeScript 4.0 se lanzó el 20 de agosto de 2020. [26] Si bien la versión 4.0 no introdujo ningún cambio importante, agregó características del lenguaje como fábricas JSX personalizadas y tipos de tuplas variádicas. [26]
TypeScript 5.0 se lanzó el 16 de marzo de 2023 e incluyó soporte para decoradores. [27]
TypeScript se originó a partir de las deficiencias de JavaScript para el desarrollo de aplicaciones a gran escala tanto en Microsoft como entre sus clientes externos. [28] Los desafíos para lidiar con código JavaScript complejo llevaron a la demanda de herramientas personalizadas para facilitar el desarrollo de componentes en el lenguaje. [29]
Los desarrolladores buscaron una solución que no rompiera la compatibilidad con el estándar ECMAScript y su ecosistema, por lo que se desarrolló un compilador para transformar un superconjunto de JavaScript con anotaciones de tipos y clases (archivos TypeScript) nuevamente en código ECMAScript 5 básico. Las clases TypeScript se basaron en la especificación de clases ECMAScript 6 propuesta en ese momento para hacer que la escritura de herencia prototípica fuera menos verbosa y propensa a errores, y las anotaciones de tipos habilitaron IntelliSense y mejoraron las herramientas.
TypeScript agrega las siguientes extensiones de sintaxis a JavaScript:
En términos sintácticos, TypeScript es muy similar a JScript .NET , otra implementación de Microsoft del estándar de lenguaje ECMA-262 que agregó compatibilidad con tipado estático y características clásicas de lenguaje orientado a objetos, como clases, herencia, interfaces y espacios de nombres. Otras inspiraciones incluyen Java y C# .
TypeScript proporciona tipado estático a través de anotaciones de tipo para permitir la verificación de tipo en tiempo de compilación .
función add ( izquierda : número , derecha : número ) : número { return izquierda + derecha ; }
Los tipos primitivos se anotan utilizando tipos en minúsculas, como number
, boolean
, bigint
y string
. Estos tipos son distintos de sus contrapartes en cajaNumber
( , Boolean
, etc.), que no pueden tener operaciones realizadas directamente desde los valores (a Number
y number
no se pueden sumar). Además, existen tipos undefined
y null
para sus respectivos valores.
Todos los demás tipos no primitivos se anotan utilizando su nombre de clase, como Error
. Las matrices se pueden escribir de dos formas diferentes que son sintácticamente iguales: la sintaxis basada en genéricos Array<T>
y una abreviatura con T[]
.
Los tipos de datos integrados adicionales son tuplas, uniones never
y any
:
[type1, type2, ..., typeN]
.|
símbolo lógico OR ( string | number
).never
tipo se utiliza cuando un tipo determinado sería imposible de crear, lo que resulta útil para filtrar tipos mapeados.any
admite las mismas operaciones que un valor en JavaScript y se realiza una comprobación de tipo estática mínima, [31] lo que lo hace adecuado para estructuras de tipado débil o dinámico. Esta es una práctica generalmente desaconsejada y debe evitarse cuando sea posible. [32]Las anotaciones de tipo se pueden exportar a un archivo de declaraciones independiente para que la información de tipo esté disponible para scripts TypeScript que utilicen tipos ya compilados en JavaScript. Las anotaciones se pueden declarar para una biblioteca JavaScript existente, como se ha hecho para Node.js y jQuery .
El compilador TypeScript utiliza la inferencia de tipos cuando no se proporcionan los tipos. Por ejemplo, add
se inferiría que el método del código anterior devuelve a number
incluso si no se hubiera proporcionado ninguna anotación de tipo de retorno. Esto se basa en que los tipos estáticos de left
y right
son number
s, y en el conocimiento del compilador de que el resultado de sumar dos number
s es siempre a number
.
Si no se puede inferir ningún tipo debido a la falta de declaraciones (como en un módulo de JavaScript sin tipos), se toma como valor predeterminado el any
tipo dinámico. Se pueden proporcionar tipos de módulos adicionales mediante un archivo de declaración .d.ts con la declare module "moduleName"
sintaxis.
Cuando se compila un script TypeScript, existe una opción para generar un archivo de declaración (con la extensión .d.ts
) que funciona como una interfaz para los componentes en el JavaScript compilado. En el proceso, el compilador elimina todos los cuerpos de funciones y métodos y conserva solo las firmas de los tipos que se exportan. El archivo de declaración resultante se puede utilizar para describir los tipos TypeScript virtuales exportados de una biblioteca o módulo JavaScript cuando un desarrollador externo lo consume desde TypeScript.
El concepto de archivos de declaración es análogo al concepto de archivos de encabezado que se encuentra en C/C++ .
declarar espacio de nombres Aritmética { sumar ( izquierda : número , derecha : número ) : número ; restar ( izquierda : número , derecha : número ) : número ; multiplicar ( izquierda : número , derecha : número ) : número ; dividir ( izquierda : número , derecha : número ) : número ; }
Los archivos de declaración de tipos se pueden escribir a mano para las bibliotecas de JavaScript existentes, como se ha hecho para jQuery y Node.js.
Grandes colecciones de archivos de declaración para bibliotecas de JavaScript populares están alojadas en GitHub en DefinitelyTyped.
TypeScript admite la programación genérica utilizando una sintaxis similar a Java . [33] El siguiente es un ejemplo de la función de identidad . [34]
función id < T > ( x : T ) : T { devolver x ; }
TypeScript utiliza el mismo estilo de anotación para los métodos y campos de clase que para las funciones y variables respectivamente. En comparación con las clases de JavaScript estándar, una clase TypeScript también puede implementar una interfaz a través de la implements
palabra clave, utilizar parámetros genéricos de manera similar a Java y especificar campos públicos y privados.
clase Persona { nombre público : cadena ; edad privada : número ; salario privado : número ; constructor ( nombre : cadena , edad : número , salario : número ) { this . nombre = nombre ; this . edad = edad ; this . salario = salario ; } toString ( ) : cadena { return ` $ { this.name } ( $ { this.age } ) ( $ { this.salario } ) ` ; } }
Los tipos de unión son compatibles con TypeScript. [35] Los valores están "etiquetados" implícitamente con un tipo por el lenguaje, y pueden recuperarse mediante una typeof
llamada a valores primitivos y una instanceof
comparación para tipos de datos complejos. Los tipos con usos superpuestos (por ejemplo, existe un método de corte tanto en cadenas como en matrices, el operador más funciona tanto en cadenas como en números) no necesitan una restricción adicional para usar estas características.
función sucesora ( n : número | bigint ) : número | bigint { // los tipos que admiten las mismas operaciones no necesitan restricción return ++ n ; } función depende de parámetro ( v : cadena | matriz < cadena > | número ) { // los tipos distintos necesitan restringirse if ( v instanceof Array ) { // hacer algo } else if ( typeof ( v ) === "cadena" ) { // hacer algo más } else { // tiene que ser un número } }
TypeScript agrega un tipo de datos 'enum' a JavaScript.
enum Cardsuit { Tréboles , Diamantes , Corazones , Picas }; var c : Cardsuit = Cardsuit . Diamantes ;
De manera predeterminada, las enumeraciones numeran a los miembros a partir de 0; esto se puede anular configurando el valor del primero:
enum Cardsuit { Tréboles = 1 , Diamantes , Corazones , Picas }; var c : Cardsuit = Cardsuit . Diamantes ;
Se pueden configurar todos los valores:
enum Cardsuit { Tréboles = 1 , Diamantes = 2 , Corazones = 4 , Picas = 8 } ; var c : Cardsuit = Cardsuit.Diamantes ;
TypeScript permite asignar el valor numérico a su nombre. Por ejemplo, esto busca el nombre del valor 2:
enum Cardsuit { Tréboles = 1 , Diamantes , Corazones , Picas }; var suitName : string = Cardsuit [ 2 ]; alerta ( suitName );
TypeScript distingue entre módulos y espacios de nombres. Ambas características de TypeScript admiten la encapsulación de clases, interfaces, funciones y variables en contenedores. Los espacios de nombres (anteriormente módulos internos) utilizan expresiones de funciones de JavaScript invocadas inmediatamente para encapsular el código, mientras que los módulos (anteriormente módulos externos) utilizan patrones de biblioteca de JavaScript existentes ( CommonJS o módulos ES). [36]
Como TypeScript es simplemente un superconjunto de JavaScript, el código JavaScript existente se puede adaptar rápidamente a TypeScript y el programa TypeScript puede consumir JavaScript sin problemas. El compilador puede utilizar todas las versiones de ECMAScript, desde la versión 5 hasta las posteriores, y transpilar características modernas, como clases y funciones de flecha, a sus contrapartes más antiguas.
Con TypeScript, es posible utilizar código JavaScript existente, incorporar bibliotecas JavaScript populares y llamar a código generado por TypeScript desde otro JavaScript. [37] Las declaraciones de tipo para estas bibliotecas generalmente se proporcionan con el código fuente, pero se pueden declarar o instalar por separado si es necesario.
El compilador TypeScript, llamado tsc
, está escrito en TypeScript . Como resultado, se puede compilar en JavaScript normal y luego se puede ejecutar en cualquier motor de JavaScript (por ejemplo, un navegador). El paquete del compilador viene con un host de script que puede ejecutar el compilador. También está disponible como un paquete Node.js que utiliza Node.js como host.
El compilador puede "apuntar" a una edición particular de ECMAScript (como ES5 para compatibilidad con navegadores heredados), pero de manera predeterminada compila para los estándares más recientes.
Mediante el uso de complementos , TypeScript se puede integrar con herramientas de automatización de compilación , incluidas Grunt (grunt-ts [43] ), Apache Maven (complemento TypeScript Maven [44] ), Gulp (gulp-typescript [45] ) y Gradle (complemento TypeScript Gradle [46] ).
TSLint [47] escanea el código TypeScript para comprobar su conformidad con un conjunto de estándares y pautas. ESLint , un linter de JavaScript estándar, también proporcionó cierto soporte para TypeScript a través de complementos de la comunidad. Sin embargo, la incapacidad de ESLint para aprovechar los servicios de lenguaje de TypeScript impidió ciertas formas de análisis semántico y de todo el programa. [48] A principios de 2019, el equipo de TSLint anunció la descontinuación del linter en favor de typescript-eslint
, un esfuerzo conjunto de los equipos de TSLint, ESLint y TypeScript para consolidar el análisis semántico bajo el paraguas de ESLint para mejorar el rendimiento, la unidad de la comunidad y la accesibilidad para los desarrolladores. [49]
CodeDOM [50] proporciona tipos que representan tipos comunes de elementos de código fuente, que se transformarán en tipos de datos, clases y declaraciones, etc. de un lenguaje de programación a través de un CodeDOMProvider. [51] Los programadores utilizan CodeDOM y un proveedor CodeDOM para construir un generador de código que genera códigos para un dominio de aplicación. El proveedor CodeDOM de TypeScript [52] genera códigos TypeScript de acuerdo con un CodeDOM.
TypeScript recibió una influencia directa de F#: uno de los creadores de TypeScript fue Luke Hoban, quien comenzó TypeScript (entonces llamado Strada) inmediatamente después de trabajar en F# 2.0. Recientemente, notó la influencia de F# en las primeras partes del diseño de TypeScript [Hoban 2017].
Intellisense, la finalización de código y la refactorización son herramientas que solo están disponibles para los usuarios de Visual Studio Professional en Windows. No hay compatibilidad con Eclipse, MonoDevelop o Emacs para ninguna de las características del lenguaje.
Y creo que este es un gran paso en falso. Si estás creando aplicaciones web que se ejecutan en cualquier sistema que no sea Windows, es probable que estés usando una Mac y lo más probable es que no uses Visual Studio. Necesitas el complemento de Visual Studio para obtener IntelliSense. Todo lo que obtienes sin Visual Studio es el tipado fuerte. No obtienes los beneficios de productividad que obtienes de IntelliSense.
.