问题 想要实现一个ts类型推导,可以在 函数wwfn传入不同类型 返回的是不同类型 代码如下
function fn1(arg) {
return new Promise(res => {
setTimeout(() => {
res(arg)
}, 1);
})
}
function wrap(fn ) {
let ret
return (args) => {
if(!ret) ret = fn(args)
return ret
}
}
const wfn = wrap(fn1)
async function init () {
const bar = await wfn(3)
const foo = await wfn('33')
}
其实就是利用infer解决,
答案 如下
function fn1<T>(arg:T):Promise<T> {
return new Promise(rel => {
setTimeout(() => {
rel(arg)
}, 1);
})
}
type GetType<T> = T extends (arg: infer P) => any ? P : T;
type Iwraparg<T> = (arg: GetType<T> ) => Promise<GetType<T>>
function wrap<T extends Iwraparg<T> >(fn : Iwraparg<T>) {
let fnwrap: Promise<GetType<T>>
return (args:GetType<T>) => {
if(!fnwrap) fnwrap = fn(args)
return fnwrap
}
}
const wfn = wrap(fn1)
async function init () {
const bar = await wfn(3)
const foo = await wfn('33')
}