检查变量是不是可调用

Posted

技术标签:

【中文标题】检查变量是不是可调用【英文标题】:Check if variable is callable检查变量是否可调用 【发布时间】:2022-01-04 10:59:37 【问题描述】:

我想创建一个帮助函数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 的函数?

【问题讨论】:

(maybeFunction: unknown): boolean -> (maybeFunction: unknown): maybeFunction is Function 或您想用于该功能的任何接口。但重点是类型保护应该使用is 编译器应该如何知道boolean 的意思是“它是否是一个函数”?你在找type predicates吗? 也许遵循 VLAZ 的建议,这样的事情会起作用,使用类型保护? function isCallable(maybeFn: unknown): maybeFn is Function return typeof maybeFn === 'function'; 【参考方案1】:

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

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

【讨论】:

为了更普遍有用(并且更好地反映实际实现检查的内容),它可能应该是(maybeFunction: any) => maybeFunction is Function。这仍然会从true | ((...args: any[]) => void) 缩小到(...args: any[]) => void

以上是关于检查变量是不是可调用的主要内容,如果未能解决你的问题,请参考以下文章

检查变量是不是设置在全局范围内?

如何在 Perl 中检查多个变量是不是为空

如何检查 Flutter 中的 Future 变量是不是发生了变化? [复制]

在 Mozart/Oz 中检查变量元组是不是不能被进一步约束

应用检查对 Firebase 可调用函数的不必要强制执行

任何 spritesheet 的可调用 spritesheet 类