【问题标题】:How to use a proper type Function on a generic function?如何在泛型函数上使用正确的类型函数?
【发布时间】:2021-07-08 18:08:37
【问题描述】:

我正在尝试修复 @typescript-eslint/ban-types lint 错误:

警告不要使用 Function 作为类型 @typescript-eslint/ban-types

我同意Function 是一个不安全的类型,应该替换为适当的函数类型,例如() => void

但是我的代码有点复杂,我不知道如何在这里避免它,因为我使用的是返回 Functiontypeof

这是我的代码的简化版本。完整版是here

function start<T>(args: unknown[], couldBeAFunction: T) {
  if (typeof couldBeAFunction === 'function') {
    runFunction(args, couldBeAFunction); // couldBeAFunction now is a Function
  }
}

function runFunction<T extends Function>(args: unknown[], target: T) {
  target.apply(args, args);
}

我不能用runFunction&lt;T extends (...args: unknown[]) =&gt; unknown&gt; 替换runFunction&lt;T extends Function&gt;,否则我会在runFunction 调用中收到以下错误:

'T & Function' 类型的参数不能分配给'(...args: unknown[]) => unknown' 类型的参数。 类型 'Function' 不匹配签名 '(...args: unknown[]): unknown'.ts(2345)

我该如何解决这个 lint 错误?

【问题讨论】:

    标签: typescript type-safety


    【解决方案1】:

    你可以使用 typeguard:

    type Fn = (...args: unknown[]) => unknown
    
    const isFn = (fn: unknown): fn is Fn => typeof fn === 'function'
    
    function start<T>(args: unknown[], couldBeAFunction: T) {
      if (isFn(couldBeAFunction)) {
        runFunction(args, couldBeAFunction); // couldBeAFunction now is a Function
      }
    }
    
    function runFunction<T extends Fn>(args: unknown[], target: T) {
      target.apply(args, args);
    }
    

    Playground

    【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多