Un alias de tipo da nombre a un tipo. Escribes type Name = ..., y a partir de ahí Name se puede usar en cualquier sitio donde se espere un tipo. A diferencia de una interfaz, un alias puede nombrar cualquier tipo, no solo formas de objeto.
Los alias solo existen en tiempo de compilación. El JavaScript generado no contiene ninguna de estas líneas type.
Sintaxis
type Name = SomeType;
type Name<T> = SomeTypeUsing<T>; // generic
export type Name = SomeType; // exported from a module
Los nombres van en PascalCase por convención. El lado derecho es cualquier expresión de tipo, y un alias puede usar otros alias, incluido él mismo (ver los tipos recursivos más abajo). El alias está disponible en todo el ámbito donde se declara, incluso por encima de la línea de declaración, porque los tipos se comprueban en tiempo de compilación y no se ejecutan en orden como const o let.
Tipos objeto
Para una forma de objeto, un alias y una interfaz se escriben casi igual. El alias usa = y normalmente termina en punto y coma.
Un alias no puede usar extends; la intersección & cumple esa función. La comprobación de propiedades de más y las propiedades opcionales y readonly funcionan exactamente igual que en las interfaces. Cuál de los dos elegir para formas de objeto se explica en la página de interface frente a type.
Uniones, tuplas y funciones
Son los casos que solo un alias puede nombrar, y la razón principal de que exista type. Un alias de unión enumera las alternativas, un alias de tupla fija la longitud y los tipos de los elementos de un array, y un alias de función describe una firma.
En scale, los parámetros no necesitan anotaciones: el alias Transform aporta sus tipos. La sintaxis de las tuplas se explica en tuplas, y el estrechamiento de uniones en la página de tipos unión.
Alias de tipo genéricos
Los parámetros de tipo hacen que un alias funcione con muchos tipos. Pueden tener valores por defecto, igual que los parámetros de una función.
Result<number> usa el valor por defecto E = string. Los alias genéricos pequeños como type Nullable<T> = T | null o type Dict<T> = Record<string, T> son habituales en código real. Los utility types integrados (Partial<T>, Pick<T, K>, ReturnType<F>) también son alias genéricos, declarados en la librería estándar.
Los alias son nombres, no tipos nuevos
Un alias no crea un tipo distinto. Es un segundo nombre para el tipo de la derecha, y el compilador trata los dos como idénticos. Dos alias de string son totalmente intercambiables:
Esto imprime cancelling u_42 sin ningún error, que es justo el bug que un alias no puede evitar. El alias sigue ayudando a quien lee (un parámetro tipado OrderId dice más que string), pero si confundir dos ids tiene que ser un error de compilación, usa un branded type como string & { readonly __brand: "OrderId" }.
Alias de tipo recursivos
Un alias puede referirse a sí mismo, y así se describen árboles, listas anidadas y JSON:
El alias Json rechaza los valores que JSON no puede representar: { when: new Date() } o { f: undefined } asignados a Json son errores de compilación (TS2322).
Tipos a partir de valores: typeof
Cuando un valor ya existe, puedes nombrar su tipo en lugar de escribirlo. El operador de tipo typeof lee el tipo de una variable, y se combina con otros operadores:
const defaults = { retries: 3, verbose: false, level: "info" };
type Options = typeof defaults;
// { retries: number; verbose: boolean; level: string }
type OptionKey = keyof typeof defaults;
// "retries" | "verbose" | "level"
function start(port: number) {
return { port, startedAt: new Date() };
}
type Server = ReturnType<typeof start>;
// { port: number; startedAt: Date }
El valor sigue siendo la única fuente de verdad: añade una propiedad a defaults y Options la sigue. Hay más sobre esto en typeof.
Exportar e importar alias
Los alias se exportan e importan igual que los valores. import type deja claro que solo se importa un tipo, así que el import siempre se elimina de la salida en JavaScript:
// shapes.ts
export type Point = { x: number; y: number };
export type Shape = { kind: "circle"; center: Point; radius: number };
// main.ts
import type { Point, Shape } from "./shapes.js";
const p: Point = { x: 1, y: 2 };
Preguntas frecuentes
¿Qué es un alias de tipo en TypeScript?
Un alias de tipo es un nombre para un tipo, declarado con la palabra clave type: type Point = { x: number; y: number }. A partir de ahí, Point se puede usar en cualquier sitio donde se espere un tipo. Puede nombrar cualquier tipo: una forma de objeto, una unión, una tupla, una firma de función, un primitivo o un tipo genérico.
¿Un alias de tipo crea un tipo nuevo?
No. Un alias es solo otro nombre para un tipo existente. Con type UserId = string y type OrderId = string, un UserId se puede pasar donde se espera un OrderId, porque los dos son simplemente string. Para crear tipos que no sean intercambiables, usa un branded type.
¿Puede un alias de tipo referirse a sí mismo?
Sí, siempre que la autorreferencia esté anidada dentro de un tipo objeto, un array o una tupla: type TreeNode = { value: number; children: TreeNode[] } y un alias Json que incluye Json[] funcionan. Una referencia directa como type Loop = Loop | string es el error TS2456, Type alias 'Loop' circularly references itself.
¿Puede un alias de tipo ser genérico?
Sí. Pon los parámetros de tipo después del nombre: type Box<T> = { value: T }, y úsalo como Box<number>. Los parámetros pueden tener valores por defecto (type Result<T, E = string> = ...) y restricciones (type Keys<T extends object> = keyof T).
¿Cómo obtengo un tipo a partir de un objeto existente?
Usa el operador de tipo typeof: const defaults = { retries: 3, verbose: false }; type Options = typeof defaults; da { retries: number; verbose: boolean }. Así mantienes una única fuente de verdad cuando el valor va primero.