¿Cuál es mecanografiado y por qué lo uso en lugar de JavaScript?

votos
1k

¿Puede por favor describir lo que es el lenguaje mecanografiado?

¿Qué puede hacer que JavaScript o bibliotecas disponibles no pueden hacer, eso me dará razón para considerarlo?

Publicado el 02/10/2012 a las 17:37
fuente por usuario
En otros idiomas...                            


5 respuestas

votos
979

Originalmente escribí esta respuesta cuando imprenta era todavía caliente-off-the-prensas. Cinco años más tarde, esta es una visión general bien, pero mira la respuesta de Lodewijk abajo para más profundidad

1000 pies vista ...

Letra de imprenta es un superconjunto de JavaScript que proporciona principalmente opcionales de tipos estáticos, las clases y las interfaces. Una de las grandes ventajas es para permitir entornos de desarrollo para proporcionar un entorno más rico para detectar errores comunes al escribir el código .

Para tener una idea de lo que quiero decir, ver video de introducción de Microsoft en el lenguaje.

Para un proyecto de gran JavaScript, adoptando mecanografiado podría resultar en el software más robusto, sin dejar de ser desplegables donde sería ejecutar una aplicación común de JavaScript.

Es de código abierto, pero que sólo te dan los inteligentes Intellisense a medida que escribe si se utiliza un IDE compatible. Inicialmente, esto era sólo Visual Studio de Microsoft (también se señaló en el blog post de Miguel de Icaza ). En estos días, otros IDE ofrecen apoyo mecanografiado demasiado .

¿Hay otras tecnologías como él?

Hay CoffeeScript , pero que realmente tiene un propósito diferente. En mi humilde opinión, CoffeeScript ofrece la legibilidad para los humanos, pero transcripción también ofrece facilidad de lectura profunda de herramientas a través de su tipificación estática opcional (ver este reciente post un poco más crítica). También hay dardo , pero eso es un lleno en el reemplazo de JavaScript (aunque se puede producir código JavaScript )

Ejemplo

A modo de ejemplo, aquí hay algo de texto mecanografiado (se puede jugar con esto en el texto mecanografiado de juegos )

class Greeter {
    greeting: string;
    constructor (message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}  

Y aquí está el código JavaScript que produciría

var Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;
    }
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;
    };
    return Greeter;
})();

Observe cómo el mecanografiado define el tipo de variables miembro y los parámetros del método de clase. Este se elimina cuando se traduce a JavaScript, sino que se utiliza por el IDE y el compilador de detectar errores, como pasar un tipo numérico al constructor.

También es capaz de inferir los tipos que no se declaran explícitamente, por ejemplo, sería determinar el greet()método devuelve una cadena.

depuración de imprenta

Muchos navegadores y entornos de desarrollo ofrecen apoyo directo a través de la depuración sourcemaps. Ver esta pregunta desbordamiento de la pila para obtener más detalles: código mecanografiado Depuración con Visual Studio

¿Quiere saber más?

Originalmente escribí esta respuesta cuando imprenta era todavía caliente-off-the-prensas. Echa un vistazo a la respuesta de Lodewijk a esta pregunta desde hace algún detalle más actual.

Respondida el 02/10/2012 a las 17:41
fuente por usuario

votos
674

Aunque la respuesta aceptada está bien, sentí que realmente no le hace justicia mecanografiado en este punto. No son los primeros días más. Letra de imprenta es encontrar mucho más la adopción ahora con varios marcos populares siendo escritas a máquina de escribir. Las razones por las que debe elegir mecanografiado en lugar de JavaScript son muchos ahora.

Relación con JavaScript

JavaScript ha sido estandarizada a través de los estándares de ECMAScript. No todos los navegadores de apoyo a utilizar todas las funciones de las normas más recientes de ECMAScript (ver esta tabla ). Letra de imprenta es compatible con los nuevos estándares de ECMAScript y los compila a objetivos (más) ECMAScript de su elección (objetivos actuales son 3, 5 y 6 [aka 2015]). Esto significa que puede utilizar las funciones de ES2015 y más allá, como módulos, funciones lambda, las clases, el operador de difusión, desestructuración, hoy. También agrega el tipo de soporte, por supuesto, que no es parte de ningún estándar ECMAScript y puede ser probable que nunca debido a la naturaleza interpretada en lugar de la naturaleza compilado de JavaScript. El sistema de tipo de mecanografiado es relativamente rica e incluye: interfaces, enumeraciones, tipos híbridos, genéricos, unión e intersección tipos, modificadores de acceso y mucho más. El sitio web oficial de mecanografiado da una visión general de estas características.

Relación con otros idiomas de orientación JavaScript

Mecanografiado tiene una filosofía única en comparación con otros idiomas que compilan tener JavaScript. Código JavaScript es mecanografiado código válido; Letra de imprenta es un superconjunto de JavaScript. Casi se puede cambiar el nombre de .jslos archivos a .tslos archivos y empezar a utilizar mecanografiado. Archivos de texto mecanografiado se compilan a LEGIBLE JavaScript, por lo que la migración hacia atrás es posible y comprender el texto mecanografiado compilado no es difícil en absoluto. Este texto mecanografiado manera se basa en los éxitos de JavaScript mientras que la mejora en sus debilidades.

Por un lado, tiene herramientas a prueba de futuro que tienen las normas modernas de ECMAScript y compilarlo a las versiones anteriores de JavaScript con Babel, siendo el más popular. Por otra parte, usted tiene idiomas que pueden diferir totalmente de JavaScript que se dirigen a JavaScript, como CoffeeScript, Clojure, Dardo, Elm, Haxe, ScalaJs, y una serie entera más (vea esta lista ). Idiomas, aunque podría ser mejor que en el futuro de JavaScript podría provocar alguna vez, corren un mayor riesgo de no encontrar suficiente de adopción para su futuro a ser garantizada. También podría tener más problemas para encontrar desarrolladores experimentados por alguna de estas lenguas, aunque los que encontrará a menudo puede ser más entusiasta. Interoperabilidad con JavaScript también puede ser un poco más complicado, ya que no están más lejos de lo que en realidad es JavaScript.

Mecanografiado se encuentra entre estos dos extremos, equilibrando así el riesgo. Letra de imprenta no es una elección arriesgada cualquier punto de vista. Se necesita muy poco esfuerzo para acostumbrarse a si está familiarizado con el lenguaje Java, ya que no es un lenguaje completamente diferente, tiene un excelente soporte JavaScript interoperabilidad y se ha visto una gran cantidad de adopción recientemente.

typing Opcionalmente estática y la inferencia de tipos

JavaScript es tipado dinámico. Esto significa JavaScript no sabe qué tipo de una variable es hasta que realmente se crea una instancia en tiempo de ejecución. Esto también significa que puede que sea demasiado tarde. Mecanografiado añade el tipo de soporte de JavaScript. Insectos que son causadas por falsas suposiciones de algún ser variable de un determinado tipo pueden ser completamente erradicadas si juega bien sus cartas; lo estricto que se escribe el código o si se escribe el código del todo depende de usted.

Mecanografiado permite escribir un poco más fácil y mucho menos explícita por el uso de la inferencia de tipos. Por ejemplo: var x = "hello"a máquina es el mismo que var x : string = "hello". El tipo simplemente se infiere de su uso. Incluso que usted no escribe explícitamente los tipos, que todavía están allí para salvarte de hacer algo que de otro modo resultaría en un error en tiempo de ejecución.

Letra de imprenta se escribe opcionalmente de forma predeterminada. Por ejemplo function divideByTwo(x) { return x / 2 }es una función válida a máquina de escribir que se puede llamar con cualquier tipo de parámetro, a pesar de que llamar con una cadena, obviamente, dar lugar a un tiempo de ejecución de error. Al igual que estamos acostumbrados en JavaScript. Esto funciona, porque cuando fue asignado explícitamente ningún tipo y el tipo no podía deducirse, al igual que en el ejemplo divideByTwo, mecanografiado implícitamente asignará el tipo any. Esto significa tipo de firma de la función divideByTwo se convierte automáticamente function divideByTwo(x : any) : any. Hay una bandera compilador para no permitir este comportamiento: --noImplicitAny. La activación de esta bandera le da un mayor grado de seguridad, sino que también significa que usted tendrá que hacer más a escribir.

Tipos tienen un costo asociado con ellos. En primer lugar hay una curva de aprendizaje, y en segundo lugar, por supuesto, le costará un poco más de tiempo para establecer una base de código usando tipos de datos estrictos adecuado también. En mi experiencia, estos costos son totalmente la pena en cualquier código base seria va a compartir con los demás. Un estudio a gran escala de los lenguajes de programación y la calidad del código en GitHub sugiere que "que los lenguajes de tipos estáticos, en general, son menos propensos que los defectos tipos dinámicos, y que una gran escritura es mejor que la tipificación débil en el mismo sentido".

Es interesante notar que este mismo documento encuentra que mecanografiado es menos propenso a errores a continuación JavaScript:

Para aquellos con coeficientes positivos que podemos esperar que el lenguaje está asociado con, ceteris paribus, un mayor número de soluciones a anomalías. Estos lenguajes incluyen C, C ++, JavaScript , Objective-C, PHP y Python. Las lenguas de Clojure, Haskell, Ruby, Scala, y mecanografiado , todos tienen coeficientes negativos lo que implica que estas lenguas son menos propensos que el promedio para dar lugar a defectos de fijación se compromete.

soporte IDE mejorada

La experiencia de desarrollo con mecanografiado es una gran mejora con respecto JavaScript. El IDE es informado en tiempo real por el compilador mecanografiado en su información de tipo rico. Esto da un par de ventajas importantes. Por ejemplo, con el texto mecanografiado puede hacerlo con seguridad refactorizaciones como cambios de nombre en toda la base de código. A través de la finalización de código puede obtener ayuda en línea en cualquier funciones de una biblioteca puede ofrecer. No hay más necesidad de recordarlos o buscarlas en las referencias en línea. Los errores de compilación se presentan directamente en el IDE con una línea ondulada de color rojo, mientras que usted está ocupado codificación. Con todo esto permite un aumento significativo de la productividad en comparación con el trabajo con JavaScript. Uno puede pasar más tiempo de codificación y menos tiempo de depuración.

Hay una amplia gama de entornos de desarrollo que tienen un excelente soporte para texto mecanografiado, como Estudio y VS código de Visual, Atom, sublime, y IntelliJ / WebStorm.

cheques nulos estrictas

Los errores de ejecución de la forma cannot read property 'x' of undefinedo undefined is not a functionson causados muy comúnmente por los errores en el código JavaScript. Fuera de la caja de texto mecanografiado ya se reduce la probabilidad de que este tipo de errores ocurren, pues no se puede utilizar una variable que no se sabe que el compilador mecanografiado (con la excepción de las propiedades de anylas variables introducidas). Todavía es posible a pesar de utilizar por error una variable que se establece a undefined. Sin embargo, con la versión 2.0 de mecanografiado puede eliminar este tipo de errores todos juntos a través del uso de tipos no anulable. Esto funciona de la siguiente manera:

Con estrictos controles habilitados nulos ( --strictNullChecksbandera del compilador) el compilador mecanografiado no permitirá undefinedque se asignará a una variable menos que se declare explícitamente a ser de tipo anulable. Por ejemplo, let x : number = undefineddará lugar a un error de compilación. Esto encaja perfectamente con la teoría de tipos, ya que undefinedno es un número. Se puede definir xcomo un tipo de suma numbery undefinedpara corregir esto: let x : number | undefined = undefined.

Una vez que un tipo es conocido por ser anulable, lo que significa que es de un tipo que también puede ser de valor nullo undefined, el compilador mecanografiado puede determinar mediante un análisis basado en el tipo de control de flujo si su código se puede utilizar con seguridad una variable o no. En otras palabras, cuando se echa una variable es undefineda través de, por ejemplo, una ifdeclaración de que el compilador mecanografiado inferirá que el tipo en esa rama de flujo de control de su código ya no es anulable y por lo tanto puede utilizar con seguridad. Aquí está un ejemplo sencillo:

let x: number | undefined;
if (x !== undefined) x += 1; // this line will compile, because x is checked.
x += 1; // this line will fail compilation, because x might be undefined.

Durante la conferencia de construcción 2016 co-diseñador de mecanografiado Anders Hejlsberg dio una explicación detallada y demostración de esta función: de vídeo (de 44:30 a 56:30).

Compilacion

Para utilizar mecanografiado se necesita un proceso de creación para compilar el código JavaScript. El proceso de construcción en general, sólo toma un par de segundos, dependiendo por supuesto del tamaño de su proyecto. El compilador mecanografiado soporta compilación incremental ( --watchbandera del compilador), de manera que todos los cambios posteriores pueden ser compilados a mayor velocidad.

El compilador puede mecanografiado inline información de mapa de origen de los archivos generados Js o crear archivos .map separadas. La información de mapa de origen puede ser utilizado por la depuración de los servicios públicos como DevTools Chrome y otro IDE de relacionar las líneas en el código JavaScript a los que ellos generan en el texto mecanografiado. Esto hace que sea posible para que usted pueda establecer puntos de interrupción e inspeccionar las variables en tiempo de ejecución directamente en su código mecanografiado. La información de mapa de origen funciona bastante bien, era mucho antes de mecanografiado, pero mecanografiado depuración en general no es tan grande como cuando se utiliza JavaScript directamente. Tomar la thispalabra clave, por ejemplo. Debido a la semántica modificados de la thispalabra clave en torno a los cierres ya ES2015, thispuede en realidad existe durante el tiempo de ejecución como una variable llamada _this(ver esta respuesta ). Esto puede confundir durante la depuración, pero en general no es un problema si usted sabe sobre él o inspeccionar el código JavaScript. Cabe señalar que Babel sufre exactamente el mismo tipo de problema.

Hay algunos otros trucos que el compilador mecanografiado puede hacer, como la generación de código basado en la interceptación de decoradores , la generación de código de carga de módulos para diferentes sistemas de módulos y analizar JSX . Sin embargo, es probable que necesite una herramienta de construcción además del compilador de imprenta. Por ejemplo, si desea comprimir el código que tendrá que añadir otras herramientas para el proceso de construcción de hacerlo.

Hay plugins disponibles para la compilación mecanografiado webpack , Gulp , ronco y casi cualquier otra herramienta de JavaScript acumulación por ahí. La documentación mecanografiado tiene una sección sobre la integración con herramientas de construcción que cubren todas. Una desfibradora también está disponible en caso de que quiera aún más el tiempo de construcción de cheques. También hay un gran número de proyectos de semillas por ahí que pueden ayudarle a empezar con el texto mecanografiado en combinación con un montón de otras tecnologías como angular 2, Reaccionar, Ember, SystemJs, WebPack, Gulp, etc.

interoperabilidad JavaScript

Desde mecanografiado está tan estrechamente relacionado con JavaScript que tiene grandes capacidades de interoperabilidad, pero se requiere un trabajo extra para trabajar con bibliotecas de JavaScript a máquina de escribir. Mecanografiado definiciones son necesarias para que el compilador mecanografiado entiende que las llamadas a funciones como _.groupByo angular.copy, o $.fadeOutno están en las declaraciones informativas ilegales. Las definiciones de estas funciones se colocan en .d.tslos archivos.

La forma más simple de una definición puede tomar es permitir un identificador que se utilizará en ninguna forma. Por ejemplo, cuando se utiliza Lodash , un archivo de definición única línea declare var _ : anyle permitirá llamar a cualquier función que desee en _, pero entonces por supuesto que también son todavía capaces de cometer errores: _.foobar()sería una llamada mecanografiado legal, pero es por supuesto una llamada ilegal en tiempo de ejecución. Si desea soporte tipo y la finalización de código a su archivo de definición necesita para ser más exactos (ver definiciones lodash para un ejemplo).

Módulos de NPM que vienen pre-empaquetados con sus propias definiciones de tipo se entienden automáticamente por el compilador mecanografiado (ver documentación ). Para casi cualquier otra biblioteca de JavaScript semipopular que no incluye sus propias definiciones a alguien que ya ha hecho definiciones de tipos disponibles a través de otro módulo de la NGP. Estos módulos tienen el prefijo "tipos" @ / y vienen de un repositorio de Github llamada DefinitelyTyped .

Hay una advertencia: las definiciones de tipos deben coincidir con la versión de la biblioteca está utilizando en tiempo de ejecución. Si no lo hacen, mecanografiado puede que no permitir de llamar a una función o eliminación de referencias a una variable que existen o permiten llamar una función o eliminar la referencia de una variable que no existe, simplemente porque los tipos no coinciden con el tiempo de ejecución en tiempo de compilación . Así que asegúrese de cargar la versión correcta de las definiciones de tipo para la versión correcta de la biblioteca que está utilizando.

Para ser honesto, hay una ligera molestia para esto y puede ser una de las razones por las que no decide mecanografiado, pero en lugar de ir por algo así como Babel, que no sufre de tener que obtener definiciones de tipos en absoluto. Por otro lado, si usted sabe lo que está haciendo usted puede fácilmente superar cualquier tipo de problemas causados ​​por los archivos de definición incorrectas o que faltan.

La conversión de JavaScript para mecanografiado

Cualquier .jsarchivo puede cambiar el nombre a una .tsy corrió a través del compilador para obtener mecanografiado sintácticamente el mismo código JavaScript como una salida (si era sintácticamente correcta en el primer lugar). Incluso cuando el compilador mecanografiado obtiene errores de compilación que todavía producirá un .jsarchivo. Incluso puede aceptar .jsarchivos como entrada a la --allowJsbandera. Esto le permite comenzar con el texto mecanografiado de inmediato. Desafortunadamente errores de compilación es probable que ocurran en el principio. Uno no necesita recordar que éstos no se muestran errores de parada como usted puede ser utilizado para otros compiladores.

Los errores de compilación que uno obtiene en un principio al convertir un proyecto JavaScript para un proyecto mecanografiado son inevitables por la naturaleza del texto mecanografiado. Mecanografiado comprueba todos los códigos de validez y por lo que necesita saber acerca de todas las funciones y variables que se utilizan. Por lo tanto las definiciones de tipo tienen que estar en su lugar para todos ellos errores de compilación de lo contrario van a ocurrir. Como se mencionó en el capítulo anterior, para casi cualquier marco de JavaScript que hay .d.tsarchivos que pueden ser fácilmente adquiridos con la instalación de paquetes DefinitelyTyped . Sin embargo, podría ser que usted ha utilizado alguna biblioteca oscura para el que no hay definiciones mecanografiado están disponibles o que ha polyfilled algunas primitivas de JavaScript. En ese caso, debe proporcionar definiciones de tipos para estos bits a fin de que los errores de compilación a desaparecer. Basta con crear un .d.tsarchivo e incluirla en el tsconfig.json filesmatriz, de modo que siempre es considerado por el compilador mecanografiado. En ella declarar los bits que mecanografiado no conoce como tipo any. Una vez que haya eliminado todos los errores se pueden introducir gradualmente a escribir a las partes de acuerdo a sus necesidades.

También será necesario algún trabajo en la (re) configuración de la tubería de acumulación para obtener mecanografiado en la tubería de construcción. Como se mencionó en el capítulo sobre la compilación hay un montón de buenos recursos hacia fuera allí y os animo a buscar proyectos de semillas que utilizan la combinación de herramientas que desea trabajar con.

El obstáculo más grande es la curva de aprendizaje. Os animo a jugar con un pequeño proyecto en un principio. Mira cómo funciona, cómo se construye, qué archivos que utiliza, cómo está configurado, cómo funciona en su IDE, cómo está estructurado, que las herramientas que utiliza, etc. La conversión de una gran base de código JavaScript para mecanografiado es muy factible cuando sabe lo que está haciendo, pero puede ser frustrante cuando no lo hace.

Adopción

Letra de imprenta es de código abierto (Apache 2 con licencia, consulte github ) y respaldado por Microsoft. Anders Hejlsberg , el arquitecto principal de C # encabeza el proyecto. Es un proyecto muy activo; el equipo mecanografiado ha sido la liberación de una gran cantidad de nuevas características en los últimos años y un montón de grandes todavía están previstas para venir (ver el mapa de ruta ).

En la encuesta Stackoverflow desarrollador 2017 mecanografiado fue el más popular transpiler JavaScript (novena posición de la general) y obtuvo el tercer lugar en la categoría de lenguaje de programación que más gustan.

Respondida el 27/01/2016 a las 18:23
fuente por usuario

votos
49

Mecanografiado hace algo similar a lo que hace menos o Sass para CSS. Son súper conjuntos de la misma, lo que significa que cada código JS que escribe es mecanografiado código válido. Además, usted puede usar las otras golosinas que se suma a la lengua, y el código transpiled será js válidos. Incluso puede configurar la versión JS que desea que el código resultante sucesivamente.

Actualmente mecanografiado es un súper conjunto de ES2015, por lo que podría ser una buena opción para empezar a aprender la nueva js características y transpile a la norma necesaria para su proyecto.

Respondida el 11/02/2016 a las 17:32
fuente por usuario

votos
29

" Fundamentos mecanografiado " - un Pluralsight vídeo-curso por Dan Wahlin y John Papa es una muy buena, en la actualidad (25 de marzo, 2016) actualizado para reflejar mecanografiado 1.8, introducción al texto mecanografiado.

Para mí las características realmente buenas, al lado de las buenas posibilidades de IntelliSense, son las clases , las interfaces , módulos , la facilidad de implementación de AMD, y la posibilidad de utilizar el depurador de Visual Studio imprenta cuando se invoca con el IE.

En resumen : Si se usa según lo previsto, Letra de imprenta puede hacer que la programación de JavaScript más fiable y más fácil. Se puede aumentar la productividad del programador JavaScript significativamente durante el pleno SDLC.

Respondida el 27/12/2015 a las 01:18
fuente por usuario

votos
7

guión 5 ECMA (ES5), que todo el apoyo del navegador y se compilan previamente. ES6 / ES2015 y ES / 2016 llegaron este año con muchos cambios de modo a aparecer estos cambios hay algo en el medio que debería tener preocupaciones acerca de lo que mecanografiado. • Letra de imprenta es Tipos -> significa que tenemos que definir el tipo de datos de cada propiedad y métodos. Si sabes C # y luego de imprenta, es fácil de entender. • La gran ventaja de que es mecanografiado Tipo identidad temas relacionados temprano antes de ir a producción. Esto permite que las pruebas de unidad a fallar si hay algún tipo de desajuste.

Respondida el 06/06/2016 a las 09:14
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more