Вы хотите, чтобы определяемая пользователем функция защиты типов проверяла, является ли string
действительным Actions
членом. Это способ явно указать компилятору, что для сужения типа значения следует использовать некое boolean
-значное выражение, если оно окажется true
. Простейший рефакторинг вашего кода будет следующим:
function isValidAction(str: string): str is Actions {
return str in Actions;
}
possiblyInvalidEvents.forEach(event => {
if (isValidAction(event.action)) {
eventsById[event.id] = {
id: event.id,
action: event.action // no error anymore
}
}
})
Эта проверка str in Actions
действительно основана на том факте, что ключи и значения enum идентичны, что не всегда может быть правдой. Возможно, мне было бы удобнее проверять фактические значения перечисления, а не ключи, что немного более неприятно для записи, но, по крайней мере, с меньшей вероятностью внезапно сломалось:
function isValidAction(str: string): str is Actions {
return (Object.keys(Actions) as Array<keyof typeof Actions>).
some(k => Actions[k] === str);
}
Но решать вам. Хорошо, надеюсь, это поможет; удачи!
Детская площадка ссылка на код