En teoría de lenguaje de programación, tipificación sensible al flujo es un sistema de tipos donde el tipo de una variable es determinado por el flujo de control.
Clásicamente, en los lenguajes con tipifícado estático, una variable queda ligada a un tipo durante todo su tiempo de uso. En los sistemas de tipificación sensible al flujo, el tipo de una variable puede cambiar dentro del cuerpo de un método, mientras atraviesa (o fluye a través de) las estructuras de control. El tipo se determina usando inferencia de tipos y la información de tipos fluye usando Tipo de dato algebraico.
El siguiente ejemplo en Ceylon ilustra el concepto:
// Object? significa que la variable "name" es de tipo Object pero puedes ser null
void hello(Object? name) {
if (is String name) {
// Ahora "name" has tipo String en este bloque
print("Hola, ``name``!");
// es posible ahora usar métodos sobre String en ella
print(" String.size vale ``name.size``");
}
else if (exists name) {
// Ahora "name" tiene tipo Object en este bloque
print("Hola, objeto ``name``!");
}
else {
print("Hola a todos!");
}
}
Su salida es la siguiente:
Hola a todos! Hola, objeto 1! Hola, Pedro Pérez! String.size vale 8
Esta técnica en conjunto con la inferencia de tipos reduce la necesidad de escribir anotaciones de tipo para todas las variables o hacer conversión de tipos, como ocurre en lenguajes con sistemas dinámicos de tipos, reduce la verbosidad en los lenguajes y ayuda a producir código más conciso, más fácil de leer y modificar.
Puede también ayudar a obtener implementaciones más rápidas de lenguajes con tipos dinámicos al predecir estáticamente el tipo de objetos.[1]
Whiley, creado por David J. Pearce, fue el primer lenguaje en hacer uso de tipificación sensible al flujo en 2009.[2][3]
Desde su introducción, otros lenguas han hecho uso de él, concretamente Ceylon, Kotlin, TypeScript[4] y Facebook Flow.[5][6][7][8]