[英]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.