Object with the same keys as another object in typescript?

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.


If the input is supposed to be an object whose values are functions or promises and the output is an object with those functions called or promises resolved, then you can use mapped types and inference from mapped types to specify that constraint:

type ProduceConditionsMapper<T> = {
  [K in keyof T]: ((input: T[K]) => void) | Promise<T[K]>;
}

declare function produce<T>(conditions: ProduceConditionsMapper<T>, input: any): T;

In action:

declare const func: (x: number) => void;    
declare const prom: Promise<string>;
const produceConditions = {
  cat: func,
  dog: prom
}

const ret = produce(produceConditions, 'hmm');
// inferred as {cat: number; dog: string;}

I'm not sure what the relationship between input and the other types are, but it's likely you could give it a more specific type than any for even better results. Anyway, hope that helps.

Tags:

Typescript