interface Entry { comment?: string; } interface Entity { fields: {[key: string]: Entry}; } type Fields = { [P in keyof E["fields"]]: E["fields"][P] }; type Nodes = { [P in keyof T]: T[P] extends Entity ? Fields : T[P] }; function makeEntityStore>(config: T): Nodes { return {} as Nodes } const myTest = makeEntityStore({ test: { fields: { id: {} } } }); myTest.test