Búsqueda de sitios web

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