Saltar al contenido

Cómo Mejorar Realmente el Tipo de Seguridad con el Texto Estricto de Banderas

El pasado verano un equipo de ingenieros convertido nuestro front-end código de Cierre-anotado JavaScript para Mecanografiado, usted puede leer sobre él aquí. Ha sido un largo viaje para tomar lo que convierte el código que se smattered con anys y convertirlo en idiomáticas y tipo de seguro de Transcripción. Los estrictos parámetros del compilador han sido el principal método para realizar estas mejoras. Siga leyendo para averiguar por qué la habilitación de la estricta Manuscrito parámetros del compilador “de la manera difícil” es la pena en el largo plazo para mejorar la seguridad de tipos.

La estricta banderas

El Manuscrito del compilador en la actualidad tiene ocho* estricto compilador de indicadores que pueden ser utilizados como herramientas para mejorar la calidad del código y, en diversos grados, aumentar la solidez de Transcripción del tipo de sistema:

  1. noImplicitThis
  2. noImplicitReturns
  3. noUnusedLocals
  4. noUnusedParameters
  5. noImplicitAny
  6. strictNullChecks
  7. strictFunctionTypes
  8. strictPropertyInitialization

* alwaysStrict también está incluido en el estricto bandera, pero es diferente que la del resto en que es especialmente modifica la emiten.

Yo, y cualquier persona que ha trabajado en un Manuscrito codebase, puede responder por el valor de la estricta banderas, pero el viaje a la habilitación de las banderas, en una base de código existente puede ser tomado en un par de maneras diferentes.

La manera más fácil

Ambos TSLint y de la mosca Tsetsé se borra creado para los Manuscritos que incluyen automatizado de fijadores para algunas reglas. Por ejemplo, con noImplicitAny para

ejemplo de la función(val) {

el compilador generará un error como

Error en srcfile.ts:11:18: Parámetro 'val' implícitamente tiene un 'cualquier' tipo.

Y el error puede ser corregido mediante la inserción de “: cualquier” comenzando en la columna 18 (del error) + “val”.longitud = 21.

ejemplo de la función(val: cualquier) {

Esto es fácil para un programa para hacer automáticamente todos los errores con noImplicitAny se resuelven fácilmente, y, al final del día, usted puede tener sus millones+ de la línea de base totalmente compatible con una estricta compilador de la bandera.

De la manera difícil

Otra manera de habilitar una estricta compilador bandera es ir a través de cada mensaje de error del compilador, de una en una, de la resolución de cada error.

Si usted es como mí, usted probablemente sólo se reían de esa idea, pero me deje convencer de que los beneficios de este método son la pena el costo.

Pregúntate cuáles son las razones para la habilitación de la estricta banderas. La respuesta es obvia: se desea crear un sonido, el tipo de seguro codebase. Añadir explícita anys para cada ubicación en la que se encuentra un error no hará nada para mejorar la seguridad de tipos ahora, y obligando a futuro código para cumplir va a hacer nada bueno en comparación con el daño causado por la sobrescribir accidentalmente válido tipo de información con la contagiosa.

Considere la posibilidad de este simple ejemplo de código.

declarar la función getInputs(): cualquier;getInputs().forEach((entrada) => consola.el registro de entrada.de la propiedad.valor));

noImplicitAny va a tirar un error que de entrada es, implícitamente, cualquier. Si fuéramos un robot, le ingenuamente silenciar ese error de escritura (de entrada: cualquier) => …, felizmente habilitar noImplicitAny, y se regocijan de que nuestro código se mantiene a un nivel superior. Pero ahora imaginemos otro ingeniero actualizaciones de la API de getInputs, y por lo que ahora tenemos:

declarar la función getInputs(): string[];getInputs().forEach((entrada: ninguna) => consola.el registro de entrada.de la propiedad.valor));

Este código—por desgracia—también compila, pero se producirá un error en tiempo de ejecución. Había de entrada no se han anotado con un cualquiera, este código le han fallado a compilar, y el ingeniero de cambio de la API habría sido capaz de resolver el problema. Sin embargo, explícitamente anotar el tipo, la oportunidad se perdió. Eligiendo el camino fácil hacia la estricta banderas, es posible perder los beneficios que se espera obtener a partir de la habilitación de ellos.

Si un ser humano mirado este mismo código, se podría suponer que getInputs devuelve una matriz y cambiar el tipo de ser al menos alguna de[], si no una más tipo específico.

Lo mejor de ambos

Tomó aproximadamente 400 ingeniero horas para permitir que sólo los noImplicitAny bandera por la mano de nuestro código. Este proceso se extendió a lo largo de 150 días desde el inicio hasta el final. Que es un largo tiempo en términos de código. Estoy sugiriendo que usted simplemente debe ir sin los beneficios de las banderas hasta que alguien tenga el ancho de banda para resolver lo que podría ser, literalmente, decenas de miles de errores para un gran legado codebase? No, No es una manera de obtener los beneficios incrementales.

Por dividir el código en distintos Manuscrito proyectos (individuales tsconfig.jsons), puede habilitar la estricta bandera de un proyecto al mismo tiempo, el bloqueo incremento de la seguridad de tipos, mientras que otros proyectos están siendo trabajadas.

Aunque es tentador para fijar el tipo de seguridad mediante programación hacer que el código cumple con los estrictos Manuscrito compilador de banderas, haciendo lo que tiene costos que no debería ser ligeramente ignorado. El uso de los errores del compilador como un activo para la atención directa a la mejora de tipos en lugar de ignorar no sólo a prevenir futuros tipos de ser absorbida por una cualquiera, pero mejorará el tipo de seguridad de tu código, que es, probablemente, el valor que se espera obtener del uso de Transcripción en el primer lugar.