我试图从下面的函数中删除第二个泛型,因为(imho)应该可以推断出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;
  },
  {}
);

这个函数的作用对我的问题不重要。这都是签名的第一部分。我宁愿只写<T, K extends keyof T>。因为这样调用函数就更容易了。
我已经定义了一个接口,这正是我想要的,但是如何添加实现呢?
interface NormalizerFactory<T extends {}> {
  <K extends keyof T>(...props:K[]):(list:T[]) => {[id:string]:T};
}

最佳答案

您可以通过将K替换为keyof T来删除第二个泛型,如下所示:

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;
  },
  {}
);

关于function - Typescript中的泛型函数和泛型推断键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41714167/

10-11 15:00