Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как строго указать использовать ВСЕ значение enum в другом типе?

Kowka_VN Знаток (458), на голосовании 6 месяцев назад
Есть код по типу такого
 // typescript
enum StatusEnum {
Error = '404',
Success = '200',
Redirect = '301'
}


interface ElementByStatus {
status: StatusEnum;
}
const ElementByStatus: ElementByStatus[] = [
{
status: StatusEnum.Success
},
{
status: StatusEnum.Error
}
]
и в этом коде typescript не ругается на то что не все значения использованы.
Важные ограничения - нельзя использовать сторонние библиотеки, линтеры и тд, нужно затипизировать строго с помощью ts. и использовать именно enum, а не объект(проект большой и поменять enum на объект очень сложно будет).
Голосование за лучший ответ
frontDev Мастер (1548) 7 месяцев назад
Вот несколько способов строго указать, что все значения перечисления должны использоваться в другом типе при использовании TypeScript:
  1. Используйте сопоставленный тип, чтобы сопоставить значения перечисления с типом:
 enum StatusEnum { 
Error = '404',
Success = '200',
Redirect = '301'
}

type Status = {
[K in keyof typeof StatusEnum]: StatusEnum[K]
};

interface ElementByStatus {
status: Status;
}
Это приведет к тому, что для статуса потребуются все значения перечисления.
  1. Определите тип как объединение всех значений перечисления:
 type Status = StatusEnum.Error | StatusEnum.Success | StatusEnum.Redirect; 

interface ElementByStatus {
status: Status;
}
  1. Добавьте универсальный тип, который требует реализации всех ключей:
 interface ElementByStatus { 
status: T;
}

const element: ElementByStatus = {
status: StatusEnum.Success
} // ошибка, не все ключи реализованы
Это гарантирует, что любая реализация ElementByStatus должна охватывать все значения перечисления.
Похожие вопросы