【问题标题】:Infer parameter types in function chain推断函数链中的参数类型
【发布时间】:2020-12-14 17:12:03
【问题描述】:

我正在尝试制作一个自制的函数映射链。问题是,我想确保输入在映射链中保持一致。我的问题是我不知道怎么写f(x:T) => U

对于我正在尝试做的一个适当的例子:

function myChainer<T>(args:T){
    return {
       map:(innerFuction:(payload: T) => unknown){
           return myChainer(innerFuction(args))
       }
    }
}

现在,如果我跑

myChainer(0)
.map((args1) => {
    return doSomething(args1) ? "a" : "b"
})
.map((args2) => {
    return doSomething2(args2) ? true : false
})

第一个map 会知道args1 的类型是Number,但第二个不会知道args2 的类型是string。而且,正如预期的那样,后续的链接函数不会知道它们各自参数的类型。 unknown 应该用什么替换,以便每个链接函数根据先前链接函数的返回类型确定其参数的类型?

【问题讨论】:

  • 请分享可重现的代码
  • 第二个泛型类型 U,没有在任何地方设置。应该在map方法上,所以内部函数可以是T => U:typescriptlang.org/play?#code/…
  • @jonrsharpe 应该在哪里设置U?我想将它设置在myChainer 中的某个位置,以便所有新的映射函数都可以从前一个函数的返回值中推断出参数的类型

标签: typescript functional-programming


【解决方案1】:

您需要使用泛型类型参数来引用 innerFunction 的返回类型,以便在递归引用 myChainer 时将该类型提供给 TS。

这就是它的样子:

function myChainer<T>(args:T){
    return {
       map<U>(innerFuction:(payload: T) => U) {
           return myChainer<U>(innerFuction(args))
       }
    }
}

【讨论】:

    【解决方案2】:

    这里有:

    
    function myChainer<T>(args: T) {
        return {
            map: <R,>(innerFuction: (payload: T) => R) => {
                return myChainer(innerFuction(args))
            }
        }
    }
    
    const foo = (arg: number) => arg.toString()
    const bar = (arg: string) => Promise.resolve(parseInt(arg, 10))
    const baz = (arg: Promise<number>) => arg
    
    
    const result = myChainer(0)
        .map(arg => foo(arg)) // arg -> number
        .map(arg => bar(arg)) // arg -> string
        .map(arg => baz(arg)) // arg -> Promise<number>
        .map(arg => foo(arg)) // expected error
    

    【讨论】:

    • @GregL 更快)
    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2013-11-10
    • 2020-10-17
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2017-10-08
    • 2019-09-12
    相关资源
    最近更新 更多