TypeScript - TypeScript

Mecanografiado
Logotipo mecanografiado 2020.svg
Paradigma Multi-paradigma : funcional , genérico , imperativo , orientado a objetos
Diseñada por Microsoft
Desarrollador Microsoft
Apareció por primera vez 1 de octubre de 2012 ; Hace 8 años ( 2012-10-01 )
Lanzamiento estable
4.2.4  Edita esto en Wikidata / 9 de abril de 2021 ; hace 4 meses ( 9 de abril de 2021 )
Versión de vista previa
4.3 Beta  Edita esto en Wikidata / 9 de abril de 2021 ; hace 4 meses ( 9 de abril de 2021 )
Disciplina de mecanografía Pato , gradual , estructural
Licencia Licencia Apache 2.0
Extensiones de nombre de archivo .ts, .tsx
Sitio web www .typescriptlang .org
Influenciado por
C # , Java , JavaScript
Influenciado
AtScript , AssemblyScript

TypeScript es un lenguaje de programación desarrollado y mantenido por Microsoft . Es un superconjunto sintáctico estricto de JavaScript y agrega escritura estática opcional al lenguaje. TypeScript está diseñado para el desarrollo de grandes aplicaciones y transcompila a JavaScript. Como TypeScript es un superconjunto de JavaScript, los programas JavaScript existentes también son programas TypeScript válidos.

Letra de imprenta se puede utilizar para desarrollar aplicaciones JavaScript para tanto del lado del cliente y del lado del servidor de ejecución (como con Node.js o Deno ). Hay varias opciones disponibles para la transcompilación. Se puede utilizar el Comprobador de TypeScript predeterminado o se puede invocar el compilador de Babel para convertir TypeScript a JavaScript.

TypeScript admite archivos de definición que pueden contener información sobre tipos de bibliotecas JavaScript existentes, al igual que los archivos de encabezado de C ++ pueden describir la estructura de archivos de objetos existentes . Esto permite que otros programas utilicen los valores definidos en los archivos como si fueran entidades TypeScript de tipo estático. Hay archivos de cabecera de terceros para las bibliotecas populares, tales como jQuery , MongoDB , y D3.js . Los encabezados de TypeScript para los módulos básicos de Node.js también están disponibles, lo que permite el desarrollo de programas de Node.js dentro de TypeScript.

El compilador de TypeScript está escrito en TypeScript y compilado en JavaScript. Tiene licencia de Apache License 2.0 . TypeScript se incluye como un lenguaje de programación de primera clase en Microsoft Visual Studio 2013 Update 2 y versiones posteriores, junto con C # y otros lenguajes de Microsoft. Una extensión oficial permite que Visual Studio 2012 también sea compatible con TypeScript. Anders Hejlsberg , arquitecto principal de C # y creador de Delphi y Turbo Pascal , ha trabajado en el desarrollo de TypeScript.

Historia

TypeScript se hizo público por primera vez en octubre de 2012 (en la versión 0.8), después de dos años de desarrollo interno en Microsoft. Poco después del anuncio, Miguel de Icaza elogió el lenguaje en sí, pero criticó la falta de soporte IDE maduro aparte de Microsoft Visual Studio , que no estaba disponible en Linux y OS X en ese momento. A partir de abril de 2021, hay soporte en otros IDE y editores de texto, incluidos Emacs , Vim , Webstorm , Atom y el propio Visual Studio Code de Microsoft .

TypeScript 0.9, lanzado en 2013, agregó soporte para genéricos. TypeScript 1.0 se lanzó en la conferencia de desarrolladores Build de Microsoft en 2014. Visual Studio 2013 Update 2 proporciona soporte integrado para TypeScript.

En julio de 2014, el equipo de desarrollo anunció un nuevo compilador de TypeScript, afirmando ganancias de rendimiento 5 veces mayores. Simultáneamente, el código fuente, que inicialmente estaba alojado en CodePlex , se movió a GitHub .

El 22 de septiembre de 2016, se lanzó TypeScript 2.0; introdujo varias características, incluida la capacidad de los programadores de evitar opcionalmente que se asignen nullvalores a las variables , 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, trayendo muchas adiciones de lenguaje como tuplas en parámetros de descanso y expresiones de propagación, parámetros de descanso con tipos de tupla, parámetros de descanso genéricos, etc.

TypeScript 4.0 se lanzó el 20 de agosto de 2020. Si bien 4.0 no introdujo ningún cambio importante, agregó características de lenguaje como Custom JSX Factories y Variadic Tuple Types.

Diseño

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. Los desafíos para tratar con código JavaScript complejo llevaron a la demanda de herramientas personalizadas para facilitar el desarrollo de componentes en el lenguaje.

Los desarrolladores de TypeScript buscaron una solución que no rompiera la compatibilidad con el estándar y su soporte multiplataforma. Sabiendo que la propuesta estándar actual de ECMAScript prometía soporte futuro para la programación basada en clases , TypeScript se basó en esa propuesta. Eso llevó a un compilador de JavaScript con un conjunto de extensiones de lenguaje sintáctico, un superconjunto basado en la propuesta, que transforma las extensiones en JavaScript normal. En este sentido, TypeScript fue una vista previa de lo que se puede esperar de ECMAScript 2015. Un aspecto único que no está en la propuesta, pero que se agregó a TypeScript, es la mecanografía estática opcional que permite el análisis de lenguaje estático, lo que facilita las herramientas y la compatibilidad con IDE.

Compatibilidad con ECMAScript 2015

TypeScript agrega soporte para características como clases, módulos y una sintaxis de función de flecha como se define en el estándar ECMAScript 2015.

Características

TypeScript es una extensión de lenguaje que agrega características a ECMAScript 6. Las características adicionales incluyen:

Las siguientes características están respaldadas desde ECMAScript 2015:

Sintácticamente, TypeScript es muy similar a JScript .NET , otra implementación de Microsoft del estándar de lenguaje ECMA-262 que agregó soporte para escritura estática y características clásicas del lenguaje orientado a objetos como clases, herencia, interfaces y espacios de nombres.

Compatibilidad con JavaScript

TypeScript es un superconjunto estricto de ECMAScript 2015, que en sí mismo es un superconjunto de ECMAScript 5, comúnmente conocido como JavaScript. Como tal, un programa JavaScript también es un programa TypeScript válido, y un programa TypeScript puede consumir JavaScript sin problemas. De forma predeterminada, el compilador tiene como objetivo ECMAScript 5, el estándar actual predominante, pero también puede generar construcciones utilizadas en ECMAScript 3 o 2015.

Con TypeScript, es posible utilizar código JavaScript existente, incorporar bibliotecas JavaScript populares y llamar a código generado por TypeScript desde otro JavaScript. Las declaraciones de tipo para estas bibliotecas se proporcionan con el código fuente.

Escribir anotaciones

TypeScript proporciona escritura estática a través de anotaciones de tipo para permitir la verificación de tipos en tiempo de compilación . Esto es opcional y se puede ignorar para usar la escritura dinámica regular de JavaScript.

function add(left: number, right: number): number {
	return left + right;
}

Las anotaciones para los tipos primitivos son number, booleany string. Letra de imprenta también es compatible con los tipos de datos siguientes anotaciones Array, Enums, void.

Tipos de datos recién introducidos son: Tuple, Union, nevery any. Una matriz con tipos de datos predefinidos en cada índice es Tupletype. Una variable que contiene más de un tipo de datos es Uniontipo. Cuando esté seguro de que algo nunca sucederá, utilice el nevertipo. Las estructuras de anytipo débil o dinámico son de tipo.

Las anotaciones de tipo se pueden exportar a un archivo de declaraciones separado para que la información de tipo esté disponible para los scripts de TypeScript utilizando tipos ya compilados en JavaScript. Las anotaciones se pueden declarar para una biblioteca de JavaScript existente, como se ha hecho para Node.js y jQuery .

El compilador de TypeScript hace uso de la inferencia de tipos para inferir tipos cuando no se dan los tipos. Por ejemplo, addse deduciría que el método en el código anterior devuelve un numberincluso si no se ha proporcionado una anotación de tipo de retorno. Esto se basa en los tipos estáticos de lefty rightbeing numbers, y el conocimiento del compilador de que el resultado de sumar dos numberses siempre a number. Sin embargo, declarar explícitamente el tipo de retorno permite al compilador verificar la corrección.

Si no se puede inferir ningún tipo debido a la falta de declaraciones, el anytipo predeterminado es el dinámico . Un valor del anytipo admite las mismas operaciones que un valor en JavaScript y se realiza una comprobación mínima de tipos estáticos para las operaciones sobre anyvalores.

Archivos de declaración

Cuando se compila un script de 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 usar para describir los tipos de TypeScript virtuales exportados de una biblioteca o módulo de JavaScript cuando un desarrollador externo lo consume desde TypeScript.

El concepto de archivos de declaración es análogo al concepto de archivo de encabezado que se encuentra en C / C ++ .

declare namespace arithmetics {
    add(left: number, right: number): number;
    subtract(left: number, right: number): number;
    multiply(left: number, right: number): number;
    divide(left: number, right: number): number;
}

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 se alojan en GitHub en DefinitelyTyped .

Clases

TypeScript admite clases de ECMAScript 2015 que integran el soporte opcional de anotaciones de tipo.

class Person {
    private name: string;
    private age: number;
    private salary: number;

    constructor(name: string, age: number, salary: number) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    toString(): string {
        return `${this.name} (${this.age}) (${this.salary})`; // As of version 1.4
    }
}

Genéricos

TypeScript admite programación genérica . El siguiente es un ejemplo de la función de identidad .

function id<T>(x: T): T {
    return x;
}

Módulos y espacios de nombres

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 la expresión de función de JavaScript invocada inmediatamente para encapsular el código, mientras que los módulos (anteriormente módulos externos) aprovechan los patrones de la biblioteca de JavaScript para hacerlo ( AMD o CommonJS ).

Herramientas de desarrollo

Compilador

El compilador de TypeScript, denominado 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 incluido con un host de script que puede ejecutar el compilador. También está disponible como un paquete Node.js que usa Node.js como host.

La versión actual del compilador es compatible con ECMAScript 5 de forma predeterminada. Se permite una opción para apuntar a ECMAScript 2015 para hacer uso de características de lenguaje exclusivas de esa versión (por ejemplo, generadores). Las clases, a pesar de ser parte del estándar ECMAScript 2015, están disponibles en ambos modos.

Compatibilidad con IDE y editor

  • Microsoft proporciona un complemento para Visual Studio 2012 y WebMatrix , soporte completo integrado en Visual Studio 2013 , Visual Studio 2015 y soporte de editor de texto básico para Emacs y Vim .
  • Visual Studio Code es un editor de código fuente multiplataforma de código abierto (en su mayoría) desarrollado por Microsoft basado en Electron . Admite TypeScript además de varios otros lenguajes y ofrece funciones como depuración y finalización inteligente de código .
  • alm.tools es un IDE en la nube de código abierto para TypeScript creado con TypeScript, ReactJS y TypeStyle.
  • JetBrains admite TypeScript con finalización de código, refactorización y depuración en sus IDE construidos en la plataforma IntelliJ, como PhpStorm 6, WebStorm 6 e IntelliJ IDEA , así como su complemento y extensión de Visual Studio, ReSharper 8.1.
  • Atom tiene un complemento TypeScript de Basarat con soporte para completar código, navegación, formateo y compilación rápida.
  • El IDE de Cloud9 en línea y Codenvy son compatibles con TypeScript.
  • Hay un complemento disponible para NetBeans IDE .
  • Hay un complemento disponible para Eclipse IDE (versión Kepler)
  • TypEcs está disponible para Eclipse IDE .
  • Cross Platform Cloud IDE Codeanywhere es compatible con TypeScript.
  • Webclipse Un complemento de Eclipse diseñado para desarrollar TypeScript y Angular 2 .
  • Angular IDE Un IDE independiente disponible a través de npm para desarrollar aplicaciones TypeScript y Angular 2, con soporte de terminal integrado.
  • Tide - Entorno de desarrollo interactivo TypeScript para Emacs .

Integración con herramientas de automatización de compilación

Mediante el uso de complementos , TypeScript se puede integrar con herramientas de automatización de compilación , incluidos Grunt (grunt-ts), Apache Maven (complemento de TypeScript Maven), Gulp (gulp-typescript) y Gradle (complemento de Gradle de TypeScript).

Herramientas de pelusa

TSLint escanea el código TypeScript para verificar su conformidad con un conjunto de estándares y pautas. ESLint , un linter de JavaScript estándar, también proporcionó algo de 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. A principios de 2019, el equipo de TSLint anunció la desaprobación de linter a favor de typescript-eslintun esfuerzo conjunto de los equipos de TSLint, ESLint y TypeScript para consolidar el linting bajo el paraguas de ESLint para mejorar el rendimiento, la unidad de la comunidad y la accesibilidad del desarrollador. Para usar TypeScript con ESLint, debe agregar @typescript-eslint/eslint-pluginy @typescript-eslint/parser.

Historial de versiones

Número de versión Fecha de lanzamiento Cambios significativos
0,8 1 de octubre de 2012 ( 2012-10-01 )
0,9 18 de junio de 2013 ( 18 de junio de 2013 )
1.0 12 de abril de 2014 ( 12 de abril de 2014 )
1.1 6 de octubre de 2014 (6 de octubre de 2014 ) mejoras de rendimiento
1.3 12 de noviembre de 2014 ( 12/11/2014 ) protected modificador, tipos de tupla
1.4 20 de enero de 2015 ( 20/01/2015 ) tipos de unión , lety constdeclaraciones, cadenas de la plantilla, el tipo de guardias, de tipo alias
1,5 20 de julio de 2015 (20 de julio de 2015 ) Módulos ES6, namespacepalabra clave, for..ofsoporte, decoradores
1,6 16 de septiembre de 2015 ( 16 de septiembre de 2015 ) Soporte JSX, tipos de intersección , declaraciones de tipo local, clases y métodos abstractos , funciones de protección de tipo definidas por el usuario
1,7 30 de noviembre de 2015 ( 30/11/2015 ) asyncy awaitapoyo,
1.8 22 de febrero de 2016 ( 2016-02-22 ) restricciones genéricas, errores de análisis de flujo de control, tipos de literal de cadena, allowJs
2.0 22 de septiembre de 2016 ( 22/09/2016 ) tipos de conocimiento nulo e indefinido, análisis de tipo basado en flujo de control, tipos de unión discriminada, nevertipo, readonlypalabra clave, tipo de thispara funciones
2.1 8 de noviembre de 2016 ( 08/11/2016 ) keyof y tipos de búsqueda, tipos mapeados, dispersión y descanso de objetos,
2.2 22 de febrero de 2017 ( 2017-02-22 ) clases mixtas, objecttipo,
2.3 27 de abril de 2017 ( 27 de abril de 2017 ) async iteración, valores predeterminados de parámetros genéricos, opción estricta
2.4 27 de junio de 2017 ( 27 de junio de 2017 ) expresiones de importación dinámicas, enumeraciones de cadenas, inferencia mejorada para genéricos, contravarianza estricta para parámetros de devolución de llamada
2.5 31 de agosto de 2017 ( 31 de agosto de 2017 ) variables de cláusula de captura opcionales
2.6 31 de octubre de 2017 ( 31/10/2017 ) tipos de funciones estrictas
2,7 31 de enero de 2018 ( 2018-01-31 ) propiedades con nombre constante, tuplas de longitud fija
2.8 27 de marzo de 2018 ( 2018-03-27 ) tipos condicionales, mejorados keyofcon tipos de intersección
2.9 14 de mayo de 2018 ( 14 de mayo de 2018 ) soporte para símbolos y literales numéricos en keyof y tipos de objetos mapeados
3,0 30 de julio de 2018 ( 30 de julio de 2018 ) referencias de proyectos, extracción y difusión de listas de parámetros con tuplas
3.1 27 de septiembre de 2018 ( 27 de septiembre de 2018 ) tipos de matriz y tupla asignables
3.2 30 de noviembre de 2018 ( 30/11/2018 ) comprobación más estricta para vincular, llamar y aplicar
3.3 31 de enero de 2019 ( 31/01/2019 ) reglas relajadas sobre métodos de tipos de unión, compilaciones incrementales para proyectos compuestos
3.4 29 de marzo de 2019 ( 2019-03-29 ) compilaciones incrementales más rápidas, inferencia de tipos a partir de funciones genéricas, modificador de solo lectura para matrices, aserciones constantes, verificación de tipos global this
3,5 29 de mayo de 2019 ( 2019-05-29 ) compilaciones incrementales más rápidas, omisión del tipo de ayudante, comprobaciones de exceso de propiedad mejoradas en tipos de unión, verificación de tipo de unión más inteligente
3.6 28 de agosto de 2019 ( 28 de agosto de 2019 ) Generadores más estrictos, distribución de matrices más precisa, mejor compatibilidad con Unicode para identificadores
3,7 5 de noviembre de 2019 ( 05/11/2019 ) Encadenamiento opcional, fusión nula
3.8 20 de febrero de 2020 ( 2020-02-20 ) Importaciones y exportaciones de solo tipo, campos privados de ECMAScript, espera de nivel superior
3.9 12 de mayo de 2020 ( 12 de mayo de 2020 ) Mejoras en la inferencia, mejoras en la velocidad
4.0 20 de agosto de 2020 ( 20-08-2020 ) Tipos de tuplas variables, elementos de tuplas etiquetados
4.1 19 de noviembre de 2020 ( 19/11/2020 ) Tipos de letras de plantilla, reasignación de claves en tipos mapeados, tipos condicionales recursivos
4.2 25 de febrero de 2021 ( 25/02/2021 ) Preservación de alias de tipo más inteligente, elementos de descanso intermedios / iniciales en tipos de tupla, controles más estrictos para el inoperador, abstractfirmas de construcción
4.3 26 de mayo de 2021 Tipos de escritura separados en las propiedades, overridey el --noImplicitOverrideindicador, mejoras en el tipo de cadena de la plantilla
4.4 26 de agosto de 2021 Análisis de flujo de control de condiciones con alias y discriminantes, firmas de índices de patrones de cadenas de símbolos y plantillas

Ver también

Referencias

Citas

Fuentes

enlaces externos