¿Hay alguna manera de generar automáticamente un tipo basado en un valor de diccionario? Por ejemplo, dado este diccionario de valores constantes:
export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = { 'UPS': 'GND', 'UPS AIR2': '2DA', 'UPS 3DAY SELECT': '3DS' }¿Hay alguna manera de generar automáticamente un tipo como este, sin tener que duplicar todo?
export type ShipMethodOptionMap = { 'UPS': 'GND', 'UPS AIR2': '2DA', 'UPS 3DAY SELECT': '3DS' }Desafortunadamente, keyof no parece funcionar ya que es un objeto y no un tipo, por lo que esto no funciona:
export type UpsShipMethodOption = keyof SHIPMETHODS // Doesn't workTambién intenté usar tipos mapeados con un tipo de unión predeclarado de las claves, pero tampoco funciona:
/* Type 'KeyOptions' is not assignable to type 'string | number | symbol'. Type 'KeyOptions' is not assignable to type 'symbol'.ts(2322) */ export type OptionsMap<KeyOptions> = { readonly [Property in KeyOptions]: string; } export const SHIPMETHODS: OptionsMap<UpsShipMethodOption> = { 'UPS': 'GND', 'UPS AIR2': '2DA', 'UPS 3DAY SELECT': '3DS' } export type UpsShipMethodOption = 'UPS' | 'UPS AIR2' | 'UPS 3DAY SELECT'Tengo un montón de diccionarios de este tipo, y la mayoría de ellos son bastante grandes (más de 30 teclas). Duplicar el diccionario en un tipo en todas partes haría que sea difícil mantenerlo en caso de que los valores cambien, ¡así que cualquier ayuda con esto sería genial!
Creo que solo quieres el typeof de operador. Simplemente obtiene el tipo de un valor.
const SHIPMETHODS = { 'UPS': 'GND', 'UPS AIR2': '2DA', 'UPS 3DAY SELECT': '3DS' } as const // as const is important. type ShipMethodOptionMap = typeof SHIPMETHODS /* type ShipMethodOptionMap = { readonly UPS: "GND"; readonly 'UPS AIR2': "2DA"; readonly 'UPS 3DAY SELECT': "3DS"; } */ type UpsShipMethodOption = keyof ShipMethodOptionMap // type UpsShipMethodOption = "UPS" | "UPS AIR2" | "UPS 3DAY SELECT" Solo tenga en cuenta el as const en su objeto que permite que TypeScript infiera los literales de cadena para que puedan convertirse en parte del tipo.