[英]Infer parameter types in function chain
我正在尝试制作一个自制的 function 映射链。 问题是,我想确保输入在映射链中保持一致。 我的问题是我不知道如何写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
。 而且,正如预期的那样,后续的链接函数不会知道它们各自的 arguments 的类型。 应该用什么来替换unknown
,以便每个链接的 function 根据先前链接的 function 的返回类型找出其 arguments 的类型?
您需要使用泛型类型参数来引用innerFunction
的返回类型,以便在递归引用myChainer
时可以将该类型提供给 TS。
这就是它的样子:
function myChainer<T>(args:T){
return {
map<U>(innerFuction:(payload: T) => U) {
return myChainer<U>(innerFuction(args))
}
}
}
在这里你有:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.