Следующий код:
type ConfigValue = {
title: string;
}
const enum ConfigKey {
ConfigA = 'config-a',
ConfigB = 'config-b'
}
// For each ConfigKey there must exist a record so I can't type it as Record<string, ConfigValue>. Doing config[ConfigKey.ConfigA] should be a safe action.
const config: Record<ConfigKey, ConfigValue> = {
[ConfigKey.ConfigA]: {
title: 'Config a title'
},
[ConfigKey.ConfigB]: {
title: 'Config b title'
}
};
// MaybeConfigKey value comes from some API so it's not always ConfigKey
function getConfigTitleOrFallback(maybeConfigKey: string) {
// config[maybeConfigKey] throws this error.
const configForKey = config[maybeConfigKey];
if (configForKey) {
return configForKey.title;
}
return 'Fallback value';
}
const title = config[ConfigKey.ConfigA].title;
console.log(title);
Выдает ошибку в заголовке. Я нашел способ решить эту проблему с помощью
a) Установка типа конфигурации на:
Record<string, ConfigValue>
Это не работает для меня, так как тогда он не проверяет, все ли ключи конфигурации существуют наверняка, и в других местах кода я использую config [ConfigKey.ConfigA]. Это должно быть безопасно и всегда возвращаться с заголовком.
б) Также можно использовать {suppressImplicitAnyIndexErrors: true}, но я не хочу этого делать, потому что это не кажется хорошей практикой.
Можно ли решить / подойти к этой проблеме другим, более эффективным способом?