Программист, CEO SHIFU.IO

Замена ENUM в TypeScript

Если вы используете 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]  
    }