typescript - Obtener el tipo de valores de un objeto const cuando el objeto tiene una anotación de tipo
Tengo una unión y un objeto así:
type FilterType = 'equals' | 'notEquals';
const labelMap: {[filterType in FilterType]: string} = {
equals: 'Equals',
notEquals: 'Not Equals',
} as const;
Y me gustaría derivar de esto el equivalente de:
type Labels = 'Equals' | 'Not Equals';
Lo más cerca que he podido llegar a esto es:
type Labels = labelMap[keyof labelMap];
Esto funciona si elimino la anotación {[filterType in FilterType]: string}, pero me gustaría mantenerla para que si agregamos nuevos filtros, nos veamos obligados a agregar una etiqueta.
¿Cómo puedo anotar el tipo de las claves del objeto y también extraer los valores? Podría hacer que los valores sean su propio tipo explícito y luego usar:
const labelMap: {[filterType in FilterType]: ValueType} = {
Pero preferiría mantenerlo centralizado si es posible, para que no necesites ir a varios lugares solo para agregar un nuevo filtro.
Respuesta #1
Simplemente usa el operador satisfies:
type FilterType = 'equals' | 'notEquals';
const labelMap = {
equals: 'Equals',
notEquals: 'Not Equals',
} as const satisfies Record<FilterType, string>;
Si agregas un nuevo elemento a la unión, verás un error si no agregas la entrada correspondiente en labelMap.
Patio de recreo
Tenga en cuenta que su anotación está "incorrecta":
type MappedType = {[filterType in FilterType]: string}
const bad: MappedType = {
equals: 'Not Equals',
notEquals: 'Equals',
} // Oops!
¡Ya que no conserva la correspondencia entre claves y valores!
Parque infantil
