利用infer获取入参类型为函数的入参

128 阅读1分钟

问题 想要实现一个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')
}