自TS 2.8以来,我们可以做到以下几点:
type ArgType<F> = F extends (a: infer A) => any ? A : any
const fn: (s: string) => 500
ArgType<(typeof fn> // => string
让我们假设以下情况。
type FunctionCollection = {
[key: string]: (s: ???) => any
}
const fnCol: FunctionCollection = {
someFn: (s: string) => 500
}
问题:有没有办法用{<1}}(或整个FunctionCollection)替换类型
???
(问题是,例如,如果ArgType<(typeof fnCol)["someFn"]> 'equals' string
,我们会??? = any
)
答案 0 :(得分:3)
由于参数类型对于该类型的每个属性可能不同,因此您需要一个类型参数:
type FunctionCollection<T> = {
[P in keyof T]: (s: T[P]) => any
}
现在要创建这样一个变量,您需要将属性指定为FunctionCollection
的类型参数,这不是理想的:
const fnColNoInference: FunctionCollection<{
someFn: string;
otherFn: number;
}> = {
someFn: (s: string) => 500,
otherFn: (s: number) => 500
}
更好的方法是使用函数的推理行为来推断常量的类型:
function functionCollection<T>(args: FunctionCollection<T>) {
return args
}
const fnCol = functionCollection({
someFn: (s: string) => 500,
otherFn: (s: number) => 500
})
let d : ArgType<(typeof fnCol)["someFn"]> // is string
let d2 : ArgType<(typeof fnCol)["otherFn"]> // is number