If I understand what you're asking correctly, your input conditions will be an implementation of ProduceConditions with some set of keys, and the return value (whether or not wrapped in a promise) will have the same keys but with the values all resolved.
In which case, the signature you're looking for would be something like:
produce<T extends ProduceConditions, U extends { [key in keyof T]: any }>(conditions: T, input: any): Promise<U> | U
Here I've used two generic types to represent the input and the output, with the requirement that the input type T meets the definition of ProduceConditions and the output type U has the same keys as T.
keyof. typescriptlang.org/docs/handbook/release-notes/…