Generando tipos TypeScript a partir de un objeto anidado
Estoy intentando generar varios tipos a partir de un objeto, pero me he quedado completamente bloqueado. Incluso la forma no-TS (generando primero objetos/arreglos más simples) y creando tipos a partir de ellos no parece funcionar. Estoy tratando de evitar repetir la información almacenada en el objeto.
¡Aprecio mucho cualquier ayuda!
// Objeto del cual quiero generar tipos
const PRODUCT_SECTIONS = {
fruit: {
name: “Fruta deliciosa”,
products: {
banana: “Banana”,
apple: “Manzana”,
},
},
vegetables: {
name: “Verduras frescas”,
products: {
mixedGreens: “Mezcla de vegetales”,
lettuce: “Lechuga”,
cucumbers: “Pepinos”,
},
},
soda: {
name: “Soda de calidad”,
products: {
coke: “Coca-Cola”,
sprite: “Sprite”,
},
},
} as const;
// Tipo deseado 1: todos los nombres de sección
type SECTION_NAME = “Fruta deliciosa” | “Verduras frescas” | “Soda de calidad”;
// Tipo deseado 2: todos los productos
type PRODUCT = “Banana” | “Manzana” | “Mezcla de vegetales” | “Lechuga” | “Pepinos” | “Coca-Cola” | “Sprite”;
// Tipo deseado 3: selección de productos permitiendo 1 producto por sección
type SELECTED_PRODUCTS_STATE = {
fruit: “Banana” | “Manzana”;
vegetables: “Mezcla de vegetales” | “Lechuga” | “Pepinos”;
soda: “Coca-Cola” | “Sprite”;
};
davy.ai
Para generar los tipos deseados, puedes usar la palabra clave
keyof
para extraer las claves del objetoPRODUCT_SECTIONS
y la palabra clavetypeof
para obtener el tipo de cada valor de clave. Aquí tienes una solución de ejemplo:Explicación:
SECTION_KEY
es un tipo genérico que representa cualquier clave en el objetoPRODUCT_SECTIONS
.PRODUCT_KEY<t>
es un tipo genérico que representa cualquier clave en el objetoproducts
del valorPRODUCT_SECTIONS[T]
, dondeT
es unaSECTION_KEY
.SECTION_NAME
es el tipo de la propiedadname
en cualquier valorPRODUCT_SECTIONS[T]
.PRODUCT
es el tipo de cualquier valorPRODUCT_SECTIONS[T]['products'][K]
, dondeT
es unaSECTION_KEY
yK
es unaPRODUCT_KEY<t>
.SELECTED_PRODUCTS_STATE
es un tipo de objeto con claves que coinciden con los valores deSECTION_KEY
y valores que son tiposPRODUCT_KEY<key>
, dondekey
es laSECTION_KEY
actual. Esto garantiza que solo se pueda seleccionar un producto por sección.Nota: Es importante usar la afirmación
as const
en el objetoPRODUCT_SECTIONS
para preservar los tipos literales de sus valores.