如何通过键访问对象值的类型?

时间:2020-04-15 11:14:56

标签: typescript typescript-typings

所以我有一个返回函数的函数。我想要这个:

fn: <T extends Object>(key: keyof T) => (value: ???) => void

我希望???成为instanceOfT[key]类型。例如,如果T={name: string; age: number}我希望fn('name')返回(value: string) => void,并且让fn('age')返回(value: number) => void

那有可能吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,无法部分推断函数的泛型类型。查看GitHub问题:

您需要使用一种解决方法:

  • 咖喱
  • 传递一个虚拟参数
  • 将所有参数指定为通用参数

查看对In TypeScript is it possible to infer string literal types for Discriminated Unions from input type of string?的回答

namespace Curry {
  type Consumer<K> = (value: K) => void;

  function makeConsumer<P>()/*: <K extends keyof P>(key: K) => Consumer<P[K]>*/ { 
    function factory<K extends keyof P>(key: K): Consumer<P[K]> {
      return (value: P[K]) => console.log(value);
    }
    return factory;
  }
  const barConsumer = makeConsumer<{ bar: string }>()("bar");
}


namespace Dummy {
  type Consumer<K> = (value: K) => void;

  function makeConsumer<P, K extends keyof P>(dummy: P, key: K): Consumer<P[K]> { 
    return (value: P[K]) => console.log(value);  
  }
  type T = { bar: string };
  const barConsumer = makeConsumer(null! as T, 'bar');
}


namespace AllParamsInGeneric {
  type Consumer<K> = (value: K) => void;

  function makeConsumer<P, K extends keyof P>(): Consumer<P[K]> { 
    return (value: P[K]) => console.log(value);  
  }
  const barConsumer = makeConsumer<{ bar: string }, 'bar'>();
}