WeekDays
- это просто тип, типы не присутствуют во время выполнения, поэтому мы не можем получить доступ к любой информации, которую тип хранит во время выполнения. Перечисления представляются как объекты во время выполнения, поэтому мы можем извлечь из них информацию. См. здесь для обсуждения типов против значений.
Обналичив преобразование пользовательского компилятора (что означает замену стандартного компилятора пользовательской версией, которая выдает дополнительную информацию), единственное, что мы можем сделать, - это создать функцию для извлечения значений, что требует от нас передачи литерала объекта, который содержит точно строки в перечислении. Хотя это требует от нас пересчета строк, компилятор проверит, что мы не добавляем лишних и не пропускаем, так что это может быть достаточно:
export declare type WeekDays = 'su' | 'mo' | 'tu' | 'we' | 'th' | 'fr' | 'sa';
function getValues<T extends string>(values: { [P in T]: P }) : T[]{
return Object.values(values);
}
// Ok values are all stated, the values are correctly stated.
getValues<WeekDays>({fr: 'fr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values don't match
getValues<WeekDays>({fr: 'frrr',mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values missing
getValues<WeekDays>({mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})
// Error values extra values
getValues<WeekDays>({funDay: 'funDay', fr: 'fr', mo: 'mo',sa:'sa',su:'su',th:'th',tu:'tu',we:'we'})