如何编写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
相关产品推荐
相关产品推荐

