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 {}