打字稿:推断函数参数

时间:2018-05-11 18:08:57

标签: typescript functional-programming conditional-types

自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

1 个答案:

答案 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