type EnumDefinition = Record; type EnumBlock = Record; type RecursiveObject = { [F in keyof Obj]: { [E in keyof Omit]:RecursiveObject } } function Block(options:Fields):()=>RecursiveObject { return ()=>{ const list = []; let fieldLookup = {}; const proxyOuter = new Proxy(function(){ return list; }, {get(_target, propName){ fieldLookup = options[propName]; if(fieldLookup) { list.push(fieldLookup._); } return proxyInner }}); const proxyInner = new Proxy({}, {get(_target, valName){ list.push(`:${fieldLookup[valName]};`); return proxyOuter; }}); return proxyOuter; } } const styles = Block({ Pos:{_:"position", Abs:"absolute", Rel:"relative"}, Display:{_:"display", Flex:"flex", Grid:"grid", None:"none", Block:"block", InlineBlock:"inline-block"} }); function Sheet>>(userClasses:UserClasses):{[Class in keyof UserClasses]:string} { return new Proxy({}, {get(_target, className){}}); } console.log(styles().Display.Block.Pos.Abs())