Typealias es un mecanismo de Kotlin para crear un nombre alternativo para un tipo existente. La palabra clave typealias permite reemplazar una declaración de tipo compleja con un alias corto y claro sin crear un nuevo tipo. Según la documentación de Kotlin (2026), typealias mejora la legibilidad del código, especialmente en las firmas de funciones con tipos funcionales. Typealias hace que el código sea autodocumentado al reemplazar declaraciones verbosas con tipos con nombre claros.
Puntos clave
Typealias (alias de tipo) es una declaración que introduce un nombre alternativo para un tipo existente. Sintaxis: typealias NuevoNombre = TipoExistente. Tras la declaración, NuevoNombre se puede usar donde se espera TipoExistente — el compilador los trata como el mismo tipo. A nivel de bytecode, typealias no deja rastro: toda la información del alias se borra en tiempo de compilación.
El propósito principal de typealias es mejorar la legibilidad del código. En lugar de una firma verbosa fun process(callback: (Result) -> Unit), se puede escribir typealias Callback = (Result) -> Unit y usar Callback como tipo de parámetro. Esto es especialmente útil cuando el mismo tipo funcional se repite en varios lugares del código: el alias sirve como punto único de definición y documenta el propósito del tipo.
Typealias no crea un nuevo tipo — es solo un sinónimo. Las variables de tipo Callback y (Result) -> Unit son totalmente intercambiables. El compilador no generará un error si se pasa una lambda directamente a una función que espera Callback. Esto distingue a typealias de inline class (value class), que crea un nuevo tipo envoltorio con comprobación en tiempo de compilación. Typealias es renombrar, no envolver.
El caso de uso más común de typealias en Kotlin son los tipos funcionales. Las firmas largas como (Int, String) -> Boolean o (List
// Without typealias
fun findUsers(
filter: (List<User>) -> List<User>
): List<User>
// With typealias
typealias UserFilter = (List<User>) -> List<User>
fun findUsers(filter: UserFilter): List<User>
// Usage in class
typealias OnClickListener = (View) -> Unit
class Button {
var onClick: OnClickListener = {}
}
En el ejemplo, el typealias UserFilter oculta el tipo funcional complejo (List
Typealias admite parámetros genéricos, lo que lo hace aún más flexible. Se puede definir typealias Mapper
// Generic typealias
typealias Mapper<T, R> = (T) -> R
typealias Provider<T> = () -> T
typealias ListTransformer<T> = (List<T>) -> List<T>
fun processNumbers(mapper: Mapper<Int, String>) {
// mapper type is (Int) -> String
}
fun main() {
val config: Provider<String> = { "default config" }
val reverse: ListTransformer<Int> = { it.reversed() }
}
En el listado, Mapper
Las clases anidadas y los tipos parametrizados largos son otra área donde typealias simplifica significativamente el código. Si una clase está profunda en una jerarquía de anidamiento (Outer.Inner.Nested), referenciarla por su nombre completo satura el código. Typealias acorta dicho acceso y lo hace más legible. Esto es especialmente relevante para clases de bibliotecas de terceros con nombres largos.
// Alias for nested class
class NetworkResponse {
class Error(val code: Int, val message: String)
}
typealias NetworkError = NetworkResponse.Error
// Alias for long library type
typealias UserId = Long
typealias JsonMap = Map<String, Any?>
fun process(error: NetworkError) {
println("${error.code}: ${error.message}")
}
fun parseJson(data: JsonMap): UserId {
return data["id"] as? Long ?: 0L
}
En el ejemplo, NetworkError es un alias para la clase anidada NetworkResponse.Error. Al importar el typealias, se puede usar NetworkError como un tipo normal sin revelar la jerarquía de anidamiento. JsonMap documenta que el mapa representa un objeto JSON. UserId aclara el propósito de Long en un contexto específico — el lector entiende inmediatamente que se trata de un identificador de usuario, no de un número arbitrario. Sin embargo, typealias no impide pasar un Long simple donde se espera UserId — para eso se necesita una value class.
Typealias e inline class (value class) resuelven problemas diferentes, aunque ambos introducen un nuevo nombre para un tipo. Typealias es solo un sinónimo: una variable de tipo UserId = Long acepta cualquier Long sin comprobación. Inline class envuelve un valor en un nuevo tipo que se comprueba en tiempo de compilación: no se puede pasar un Long simple donde se espera una inline class UserId sin una conversión explícita.
| Característica | Typealias | Inline class |
|---|---|---|
| Nuevo tipo | No — sinónimo del original | Sí — nuevo tipo con comprobaciones |
| Rendimiento | Cero — se borra por completo | Cero — el envoltorio se elimina en bytecode |
| Herencia | No | No (clase final) |
| Métodos propios | No | Sí — se pueden declarar funciones |
| Seguridad de tipos | No — intercambiable con el original | Sí — el compilador distingue tipos |
La tabla muestra la diferencia entre los dos mecanismos. Typealias es adecuado para nombres concisos y documentación del código cuando no se requiere tipado estricto. Inline class mediante la palabra clave value class (anteriormente inline class) es necesaria cuando es importante distinguir valores semánticamente diferentes del mismo tipo primitivo. Por ejemplo, UserId y OrderId son ambos Long, pero pasar uno donde se espera el otro es un error lógico que value class previene en tiempo de compilación.
Preguntas frecuentes
Import alias (import com.example.LongName as Short) funciona a nivel de importación — acorta el nombre solo en el archivo actual. Typealias declara un alias global disponible en todo el proyecto después de la importación.
Sí, typealias admite definiciones recursivas para tipos funcionales, pero con precaución: typealias Rec
No, typealias se borra por completo en tiempo de compilación. El tipo original se usa a nivel de bytecode y runtime sin ningún envoltorio. El rendimiento es idéntico al uso directo del tipo original.
Typealias puede referenciar a otro typealias — esto se llama una cadena de alias. La profundidad de la cadena no está formalmente limitada, pero para legibilidad se recomiendan no más de 2–3 niveles. El compilador resuelve completamente la cadena en la etapa de análisis.
No, typealias es una declaración de nivel superior o un miembro de una clase/objeto. No se puede declarar typealias dentro de funciones. Para acortar tipos localmente, use import alias dentro del archivo o coloque el typealias a nivel de módulo.
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también