Если вы используете ENUM в TypeScript, то, возможно замечали, что нельзя обращаться к ключам enum объекта через, допустим, строковые литералы, например так нельзя сделать:
enum ENUM_EXAMPLE {
VAR1 = 'VAR1',
VAR2 = 'VAR2',
}
function test_types(t: ENUM_EXAMPLE2) {}
test_types('VAR1') // Так обращаться нельзя
Плюс, есть нюансы по тому как enum транспиллируется в JS.
Вот как можно сделать работу через const assertions:
const ENUM_EXAMPLE = {
VAR1: 'VAR1_KEY',
VAR2: 'VAR2_KEY',
} as const
type EnumValues<T> = T[keyof T]
type types = EnumValues<typeof ENUM_EXAMPLE>
function test_types(t: types) {}
test_types('VAR1_KEY') // Это работает
test_types(ENUM_EXAMPLE.VAR1) // Это тоже работает
Можно обращаться по фактическим ключам объекта:
const ENUM_EXAMPLE = {
VAR1: 'some var',
VAR2: 'some other var',
} as const
type types = keyof typeof ENUM_EXAMPLE
function test_types(t: types) {}
test_types('VAR1') // Теперь обращаемся по ключам объекта
test_types(ENUM_EXAMPLE.VAR1) // Аналогично
Можно сделать массив значений, используя его значения как типы:
export const Types = [
'one',
'two',
'three',
] as const
interface IExample {
selectedType: typeof Types[number]
}