2

I am trying to remove the second generic from the following function, because (IMHO) it should be possible to infer the K extends keyof T:

const normalizeToProps = <T, K extends keyof T>(...props:K[]) => (list:T[]):{[id:string]:T} => list.reduce(
  (map, item) => {
    const identifier = castArray(get<T, T[K]|T[K][]>(item, props)).join('');
    map[identifier] = item;
    return map;
  },
  {}
);

What the function does is not important for my issue. It's all about the first part of the signature <T, K extends keyof T>. I rather would only write <T>. Because then it would be easier to call the function.

I already defined an interface which is exactly what I want, but how do I add the implementation?

interface NormalizerFactory<T extends {}> {
  <K extends keyof T>(...props:K[]):(list:T[]) => {[id:string]:T};
}
Sebastian Sebald
  • 16,130
  • 5
  • 62
  • 66

1 Answers1

0

You can remove the second generic by replacing K with keyof T, like this:

const normalizeToProps = <T>(...props:(keyof T)[]) => (list:(keyof T)[]):{[id:string]:T} => list.reduce(
  (map, item) => {
    const identifier = castArray(get<T, T[keyof T]|T[keyof T][]>(item, props)).join('');
    map[identifier] = item;
    return map;
  },
  {}
);
Seamus
  • 4,539
  • 2
  • 32
  • 42