type FromInput<T, Acc = never> = T extends `${string}{${infer K}}${infer Rest}`
  ? FromInput<Rest, Acc | K>
  : Acc

declare const t: <const TInput>(input: TInput, options: {
  replace: Record<FromInput<TInput>, unknown>
}) => string

enum Messages {
  InitialMessage = 'hello, {name}! you have {n} messages',
}

t(Messages.InitialMessage, {
  replace: {
    name: 'User',
    n: 0,
  },
})

t(Messages.InitialMessage, {
  replace: {
    // @ts-expect-error the line below will fail as 'nxame' does not exist on 'name' | 'n'
    nxame: 'User',
    n: 0,
  },
})

export {}