检查变量是否可调用

我想创建一个帮助函数 isCallback 返回函数是否​​可调用。

我有一个类型可以是 true 或带有特定参数的回调。在我当前的代码中,我有很多像 typeof foo === 'function' 这样的检查,我想用 isCallback 函数重构这些检查。

我创建了这个辅助函数 isCallback

export const isCallback = (maybeFunction: unknown): boolean =>
  typeof maybeFunction === 'function'

我的问题是,当我使用它时,TypeScript 很困惑:

if(isCallback(foo)) {
  foo(myArgs)  // Error here
}

并抱怨:

This expression is not callable.
  Not all constituents of type 'true | ((result: Result) => void)' are callable.
    Type 'true' has no call signatures.

如果变量是可调用的并且 TypeScript 也知道它,我如何创建一个返回 true 的函数?

stack overflow Check if variable is callable
原文答案
author avatar

接受的答案

正如 @jonrsharpe 指出的那样,使用 type predicates 有效。

export const isCallback = (
  maybeFunction: true | ((...args: any[]) => void),
): maybeFunction is (...args: any[]) => void =>
  typeof maybeFunction === 'function'

答案:

作者头像

一个明确的通用功能,

function isCallback<T>(maybeFunc: T | unknown): maybeFunc is T {
  return typeof maybeFunc === 'function';
}

您可以使用类型 Function 作为 T 的默认值,例如 <T = Function> 。但我不会推荐它。如果你使用 eslint@typescript-eslint/ban-types 规则,它会抱怨使用类型 Function