所以我有一个返回函数的函数。我想要这个:
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
那有可能吗?
答案 0 :(得分:1)
不幸的是,无法部分推断函数的泛型类型。查看GitHub问题:
您需要使用一种解决方法:
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'>();
}