Seguidad de Tipos:
Introducción
Seguidad de Tipos para JavaScript
Cuando creas un nuevo proyecto con create-composi-app
éste ya viene con todo para preveer JavaScript con seguridad de tipos. Lo hace por dirigirlo a Visual Studio Code que use su Servicio de Lenguage TypeScript para chequear los tipos del código JavaScript en tiempo actual, mientras lo escribas.
JavaScript No Tiene Tipado Fuerte
JavaScript fue diseñado para ejecutarse en el navegador, por lo que no es necesario construirlo ni compilarlo. A diferencia de
cualquier otro idioma, JavaScript es el único que tiene que tratar con el DOM del navegador. El DOM tiene su propio sistema de tipos y JavaScript tiene que tratar con eso. Para hacerlo, JavaScript utiliza la
coerción de tipos. Por ejemplo, si usas document.getElementById
consigues un objeto de tipo Element
. Pero document.querySelector
devuelve HTMLElement
. Estos no son la misma cosa. Si el elemento que estaba obteniendo era de etiqueta input
, su tipo sería HTMLInputElement
, que es
diferente de los dos tipos anteriores. En un lenguaje fuertemente tipado, estos no serían intercambiables porque sus propiedades no se superponen. A través de la coerción de tipos, JavaScript te permite acceder al DOM sin tener
que preocuparse por los tipos subyacentes.
Suponga que usas getElementById
para obtener un elemento de input
. Entonces deseas obtener el valor de
ese element de esta manera:
const formInput = document.getElementById('form-input')
const valor = formInput.value
Esto parece sencillo. Es algo que hacemos todo el tiempo. Pero lo que realmente está sucediendo es que se devuelve un tipo Element
. Este es un tipo muy genérico. No tiene propiedad de nombre value
del elemento formInput
, JavaScript convierte el element formInput
a tipo HTMLInputElement
.
La coerción de tipos facilita el trabajo con el DOM. Sin embargo, a veces es difícil saber cuándo y cómo ocurre la coerción de tipos, lo que resulta en resultados inesperados para los desarrolladores. Además de eso, debido a que JavaScript es un lenguaje interpretado que se ejecuta en el navegador, no hay forma de saber si el código es correcto hasta que se carga en el navegador. Básicamente, el navegador es su compilador y entorno de prueba. Los idiomas fuertemente tipados requieren un paso de compilación durante el cual el código se chequea para la corrección de tipos. Si no es correcto, la compilación falla con información relevante sobre los errores de tipo para que pueda corregirlos.
Para JavaScript simple, ejecutarlo en el navegador para detectar errores no es gran cosa. Pero si el código es mucho y complejo, esto se vuelve más productivo. El número y los tipos de errores en una base de código aumentan exponencialmente con el número de personas que trabajan en él.
La Prevención Es La Mejor Cura
Hay varias tendencias para evitar los muchos tipos de errores de JavaScript que pueden causar un bloqueo. Chequear el código con JSHint, ESLint, etc., se le advierte sobre patrones y usos dudosos en su código. Prettier hace que el formato del código sea consistente entre los miembros del equipo. Y ahora hay docenas de lenguajes con tipado fuerte que se compilan en JavaScript. Estos proporcionan seguridad de tipo estático en el momento de la construcción. Esto verifica que los tipos son correctos antes de que el JavaScript se cargue en el navegador. Existen muchos lenguajes que proporcionan verificación de tipos estáticos para JavaScript: GWT, ClosureScript, Elm, PureScript, Reason, TypeScript, etc.
Independientemente del idioma que utilice para proporcionar seguridad de tipo para su código, una vez que se convierte a JavaScript y se ejecuta en el navegador o en Node, no hay seguridad de tipo. Si todo el código es tuyo de tu equipo, puedes tener un alto grado de certeza de que su código será de tipo seguro. Sin embargo, si estás utilizando librerías, datos o API de otra gente, no puedes estar seguro. En tal caso, la única manera de asegurarse de que el código tenga los tipos correctos durante el tiempo de ejecución es usar guardas de tipos.
JSDoc
Composi proporciona seguridad de tips de otra manera. Utiliza TypeScript para la seguridad de tipos, pero directamente en JavaScript. TypeScript fue diseñado para poder comprender el uso de tipos de JavaScript a través de la inferencia. Esto no es tan útil porque en la mayoría de los casos trata tantas cosas como tip any
, que es demasiado genérico. TypeScript comprende los comentarios de JSDoc, incluida la información de tipo que se corresponde estrechamente con los de TypeScript. Esto significa que puede proporcionar su código JavaScript con información de tipo con comentarios JSDoc que TypeScript puede comprender, lo que le permite verificar la exactitud de los tipos. Esto significa que a medida que escribe JavaScript, recibirá advertencias sobre el uso incorrecto del tipo e Intellisense enriquecido sobre el código que está utilizando y la finalización del código con sugerencias.
El código esencial de Composi ya viene con seguridad de tipos. Pero cualquier código que escribas tu necesitará definiciones de tipo para que sea seguro. Puedes aprender cómo proporcionar la definición de tipo con JSDoc en la documentación.