【问题标题】:Typescript: Infer function argument打字稿:推断函数参数
【发布时间】:2018-05-12 02:36:06
【问题描述】:

自 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
}

问题:有没有办法用这样的类型替换 ???(或整个 FunctionCollection)

ArgType<(typeof fnCol)["someFn"]> 'equals' string

(问题是,例如,如果??? = any,我们得到any

【问题讨论】:

    标签: typescript functional-programming conditional-types


    【解决方案1】:

    由于类型的每个属性的参数类型可能不同,因此您需要一个类型参数:

    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
    

    【讨论】:

    • 不错!在我的案例中,我已经使用了第一个解决方案,但来到这里是为了更好的解决方案。我喜欢第二个!但是,我意识到这并不能解决我的实际问题。我会跟进。
    猜你喜欢
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2021-01-03
    • 2020-03-22
    • 2021-02-15
    相关资源
    最近更新 更多