【问题标题】:Typescript callback arguments, which are resolved using a function打字稿回调参数,使用函数解析
【发布时间】:2019-01-30 18:22:12
【问题描述】:

我有一种情况,我用一些参数调用一个函数,这些参数是使用另一个函数解决的。

这就是代码的样子。

function getArgs (): [string, number] {
  return ['hello world', 22]
}

function callFnWithArgs (callback) {
  callback(...getArgs())
}

callFnWithArgs(function (/* typehint here */) {
})
  1. 函数callFnWithArgs 接受一个回调,然后通过传递一些参数来执行它。
  2. 这些参数由另一个名为 getArgs() 的函数提供。

那么,有什么办法可以输入hint,回调的参数,是另一个函数的返回值吗?

【问题讨论】:

    标签: typescript typescript3.0


    【解决方案1】:

    在 TypeScript 3.0 或更高版本中,您可以使用标准库中的 ReturnType 类型别名来确定 getArgs 的返回类型,然后使用 rest 参数将其与 callFnWithArgs 的回调联系起来:

    function getArgs (): [string, number] {
      return ['hello world', 22]
    }
    
    function callFnWithArgs (callback: (...args: ReturnType<typeof getArgs>) => void) {
      callback(...getArgs())
    }
    
    callFnWithArgs(function (a, b) {
      // a is string, b is number
    })
    

    【讨论】:

      【解决方案2】:

      你可以定义callback的类型:

      function callFnWithArgs (callback: (a: string, b: number) => void) {
        callback(...getArgs())
      }
      

      或者,如果可以选择从函数callFnWithArgs 外部传递参数,您可以使用通用剩余参数

      function getArgs (): [string, number] {
        return ['hello world', 22]
      }
      
      function callFnWithArgs<T extends any[]>(args: T, callback: (...args: T) => void) {
        callback(...args);
      }
      
      callFnWithArgs(getArgs(), (str, nr) => {
      })
      

      另一种方法是为参数创建具有泛型类型的重载:

      function getArgs(): [string, number] {
        return ['hello world', 22]
      }
      function callFnWithArgs<T>(callback: (a: T) => void);
      function callFnWithArgs<T1, T2>(callback: (a: T1, b: T2) => void);
      function callFnWithArgs(callback: (...args: any[]) => void) {
        callback(...getArgs());
      }
      
      callFnWithArgs<string, number>((str, nr) => {
      })
      

      【讨论】:

      • 我确实喜欢这种方法,但是如果我在使用callFnWithArgs 时必须调用getArgs(),那么它会破坏整个代码的用途。
      • 还有一个错误“休息参数必须是数组类型。”在(...args: T) =&gt; void
      • @sherlock.92 你可能没有使用 TypeScript 3
      【解决方案3】:

      它能解决你的任务吗?

      function getArgs(): [string, number] {
        return ['hello world', 22]
      }
      
      function callFnWithArgs (callback: (a: string, b: number) => void) {
        const [a, b] = getArgs();
        callback(a, b);
      }
      
      callFnWithArgs(function (a: string, b: number) {
      })
      

      【讨论】:

      • 不! getArgs 函数可以由我的代码的用户定义,他们不能更改callFnWithArgs 的签名。
      猜你喜欢
      • 2020-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-27
      • 2021-06-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多