You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写TypeScript可正确识别的可调用变量判断函数isCallback

解决方案

你遇到的是TypeScript自定义类型守卫的典型场景:普通返回布尔值的函数无法给TS提供类型收窄的推导依据,需要用**类型谓词(Type Predicate)**标注返回值类型,告诉TS当函数返回true时,参数符合指定的函数类型。

基础实现(适配任意函数类型)

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

泛型实现(适配自定义回调类型)

如果你的业务中需要限定回调的参数/返回值类型,可以用泛型实现更精准的类型收窄:

// 泛型T限定为任意函数类型
export const isCallback = <T extends (...args: any[]) => any>(maybeFunction: unknown): maybeFunction is T =>
  typeof maybeFunction === 'function'

使用示例

对应你业务中的true | ((result: Result) => void)联合类型,使用方式如下:

type Result = { /* 你的业务Result类型定义 */ }
type BusinessUnion = true | ((result: Result) => void)

const foo: BusinessUnion = /* 业务逻辑赋值 */

if (isCallback<(result: Result) => void>(foo)) {
  // 此分支内TS会自动识别foo为回调类型,可正常调用无报错
  foo({ /* 传入符合要求的Result参数 */ })
}

固定回调类型的简化实现

如果你的工具函数只用于判断当前业务的特定回调类型,也可以直接把类型写死,避免每次调用传泛型:

type Result = { /* 你的业务Result类型定义 */ }
type ResultCallback = (result: Result) => void

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

原理说明

参数名 is 类型是TS的类型谓词语法,专门用于自定义类型守卫函数。TS会在该函数返回true时,自动将入参的类型收窄为is后面指定的类型,和内置的typeof、instanceof判断有同样的类型推导效果。


内容的提问来源于stack exchange,提问作者J. Hesters

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:45:07