typescript - ¿Cómo obligo a un objeto a incluir todos los valores del enum como claves de propiedad?
Supongamos que tengo este enum:
export enum translationKeys {
resp_action_denied = "resp_action_denied",
resp_invalid_request = "resp_invalid_request",
}
Uso este enum para extraer valores de cadena únicos de una sola fuente. Cada uno de ellos se asigna a un objeto de resolución de cadena:
const translations: {
[key: string]: RequiredTranslations;
} = {
resp_action_denied: {
ENG: "Foo bar",
GER: "Ich bin"
},
resp_invalid_request: {
ENG: "Baz",
GER: "Das"
},
¿Hay alguna manera de forzar que este objeto incluya todos los enums como claves, de lo contrario, generar un error de compilación?
Respuesta #1
Puedes simplemente usar el tipo mapeado Record:
export enum translationKeys {
resp_action_denied = "resp_action_denied",
resp_invalid_request = "resp_invalid_request",
}
const translations: Record<translationKeys, { ENG: string, GER: string}> = {
resp_action_denied: {
ENG: "Foo bar",
GER: "Ich bin"
},
[translationKeys.resp_invalid_request]: { // can also use computed prop to reference the enum instead of the value.
ENG: "Baz",
GER: "Das"
}
};
Respuesta #2
Si quieres, también puedes usar aserciones const y deshacerte de los enums:
export const translationKeys = {
resp_action_denied: 'resp_action_denied',
resp_invalid_request: 'resp_invalid_request',
}
const languages = ['ENG', 'GER'] as const
type RequiredTranslations = { [key in (typeof languages)[number]]: string }
type Translations = {
[key in keyof typeof translationKeys]: RequiredTranslations
}
const translations: Translations = {
resp_action_denied: {
ENG: 'Foo bar',
GER: 'Ich bin',
},
resp_invalid_request: {
ENG: 'Foo bar',
GER: 'Ich bin',
},
}
P.D.: necesitarás TypeScript 3.4 o superior
