Desde mi punto de vista, si puede trabajar de forma natural dentro de un lenguaje tipado estáticamente, entonces el tipeo estático es el camino a seguir. En general, el propósito de un sistema de tipos es evitar que realice operaciones con una semántica indefinida, como (string) "hello" + (bool) true
. Tener el nivel adicional de seguridad que le impide realizar estas operaciones puede ser una buena manera de evitar errores en su código, incluso sin pruebas unitarias extensas. Es decir, la seguridad de tipos proporciona otro nivel de confianza en la corrección semántica de su código.
Pero los sistemas de tipos son muy difíciles de corregir. Yo no creo que es un sistema de tipo perfecto en la naturaleza en el momento de escribir estas líneas. (Por "sistema de tipo perfecto", me refiero a un sistema de tipo estricto, que no requiere anotaciones de código detallado, que no genera errores de tipo falso positivo, y cuyos errores de tipo son fáciles de entender para el programador). Además, puede será difícil entender los sistemas de tipos realmente buenos que existen. Cuando estaba aprendiendo Haskell, no puedo decirte la cantidad de errores de tipo oscuro que recibí al intentar escribir lo que me pareció (para mí) el código correcto. Por lo general, el código no era realmente correcto (lo cual es un punto a favor del sistema de tipos), pero tomó muchode trabajo para comprender los mensajes de error del compilador, para poder corregir los problemas subyacentes. En los lenguajes OO, puede que eventualmente te encuentres pensando "este argumento debería ser contravariante con el tipo de entrada, no covariante", o (más probablemente) volver a los tipos de letra para escapar de los límites del sistema de tipos. Los sistemas de tipos pueden ser mucho más complicados de lo que piensas.
Por lo que vale, entiendo que la dificultad de encontrar buenos sistemas de tipos es parte de lo que motivó a Gilad Bracha a incluir soporte de sistemas de tipos conectables en Newspeak.