TypeScript
Utility types
Uso de utility types integrados para transformar propiedades, seleccionar claves, modelar funciones y reutilizar operaciones comunes del sistema de tipos.
- Última actualización
- Actualizada
- Nivel
- Fundamentos
TypeScript
Uso de utility types integrados para transformar propiedades, seleccionar claves, modelar funciones y reutilizar operaciones comunes del sistema de tipos.
type ProductPatch = Partial<Product>;Vuelve opcionales todas las propiedades de primer nivel.
No es profundo y puede permitir cambios de campos que no deberían editarse. Restringe primero:
type ProductPatch = Partial<
Pick<Product, "name" | "price" | "stock">
>;type CompleteOptions = Required<Options>;Retira optional de primer nivel. No crea defaults runtime.
type ReadonlyProduct = Readonly<Product>;Impide asignaciones por esa vista estática. No congela y no es profundo.
type ProductPreview = Pick<
Product,
"id" | "name" | "price"
>;type PublicUser = Omit<
User,
"passwordHash" | "internalNotes"
>;No uses Omit como única protección de serialización: el objeto runtime todavía puede contener secretos. Construye un DTO explícito.
type StatusLabels = Record<Status, string>;Exige una propiedad por cada miembro de la union.
type FinalStatus = Exclude<
Status,
"idle" | "loading"
>;Filtra miembros de una union por assignability.
type ErrorResult = Extract<
Result<Product, ValidationError>,
{ ok: false }
>;type DefinedName = NonNullable<
string | null | undefined
>;
// stringtype SaveArguments = Parameters<
typeof saveProduct
>;Produce una tuple de parámetros.
type ProductResult = ReturnType<
typeof createProduct
>;type ServiceArguments = ConstructorParameters<
typeof ProductService
>;type Service = InstanceType<
typeof ProductService
>;Normalmente el nombre de clase ya representa la instancia; aporta con constructors genéricos o values recibidos.
type LoadedProduct = Awaited<
ReturnType<typeof loadProduct>
>;Desenvuelve promises y thenables según las reglas de await.
type Receiver = ThisParameterType<
typeof method
>;type BoundMethod = OmitThisParameter<
typeof method
>;type Descriptor<D, M> = {
data: D;
methods: M & ThisType<D & M>;
};Es un marcador contextual y requiere noImplicitThis; no transforma un tipo de función directamente.
function choose<T>(
options: readonly T[],
initial: NoInfer<T>,
): T {
return initial;
}Evita que una posición influya en inferencia.
Uppercase<"product">;
Lowercase<"PRODUCT">;
Capitalize<"product">;
Uncapitalize<"Product">;Trabajan con string literal types.
type ReadonlyOrder = Readonly<Order>;order.customer.name puede seguir mutable si customer no es readonly.
type CreateProductInput = Omit<
Product,
"id" | "createdAt"
>;Es cómodo, pero acopla el input al modelo persistido. Si cambias Product, el contrato de creación puede cambiar accidentalmente.
A veces es mejor declarar un tipo de dominio explícito:
type CreateProductInput = {
name: string;
price: number;
initialStock: number;
};type ProductFormValues = Pick<
Product,
"name" | "price" | "stock"
>;
type ProductFormErrors = Partial<
Record<keyof ProductFormValues, string>
>;¿Por qué Omit<User, "passwordHash"> no garantiza que el objeto enviado no contenga passwordHash?
Porque Omit solo cambia la vista estática. El valor runtime puede seguir teniendo la propiedad; debes construir explícitamente el DTO que serializas.
Tipos recursivos y límites del type system cierra el bloque mostrando estructuras anidadas y costo del checker.