Как получить доступ к типу значения объекта по его ключу? - PullRequest
0 голосов
/ 15 апреля 2020

Итак, у меня есть функция, которая возвращает функцию. Я хочу получить это:

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 Ответ

1 голос
/ 15 апреля 2020

К сожалению, невозможно частично определить тип вашей функции c. См. Проблемы GitHub:

Вам необходимо использовать один из обходных путей:

  • Curry
  • Передать фиктивный параметр
  • Указать все параметры как обобщенные c аргументы

См. Ответ на В TypeScript можно вывести строковый литерал типы для Дискриминационных Союзов из типа ввода строки?

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'>();
}
...