export type StringKeyedObject = { [ key ] : any ; } ; export function indexedStrEnum < O extends StringKeyedObject > ( values ) { let result = Object . keys ( values ) . reduce ( ( res , key ) => { res [ key ] = values [ key ] . v ; return res ; } , Object . create ( null ) ) ; return Object . freeze ( result ) ; } export function boxEnum < T extends string > ( val ) { return { v : val } ; }