如何让TypeScript识别自定义类型检查别名函数的类型守卫功能?
如何让TypeScript识别自定义类型检查函数
我正在将代码库迁移至TypeScript,其中存在大量如isFunction、isArray、isString这类简写类型检查函数。希望能向TypeScript解释器声明这些函数的作用(例如isFunction(x)等价于typeof x === 'function'),以便继续使用这些简写函数。
当前代码如下:
function isFunction (x) { return typeof x === 'function'; } function isArray (x) { return x instanceof Array; } function isString (x) { return (typeof x === 'string'); }
目前TypeScript仅识别这些函数返回boolean类型,无法知晓它们的类型判断逻辑,导致使用时出现编译错误。例如:
function doCallback(callback?: () => {}) { if (typeof callback === 'function') callback(); // TypeScript解释器允许此操作 } function doCallback(callback?: () => {}) { if (isFunction(callback)) callback(); // 错误:无法调用可能为undefined的对象。 }
解决方案:使用类型谓词(Type Predicates)
给自定义检查函数添加类型谓词的返回类型声明,就能让TypeScript识别它们的类型判断逻辑,实现和原生typeof/instanceof一致的类型缩小效果。
修改后的代码如下:
function isFunction(x: unknown): x is Function { return typeof x === 'function'; } function isArray(x: unknown): x is Array<unknown> { return x instanceof Array; } function isString(x: unknown): x is string { return typeof x === 'string'; }
关键说明:
- 参数
x指定为unknown,确保函数能接收任意类型的输入 - 返回类型
x is [目标类型]是类型谓词,明确告知TypeScript:当函数返回true时,参数x必然属于声明的目标类型
修改后再使用这些函数,TypeScript就能正确识别类型缩小:
function doCallback(callback?: () => {}) { if (isFunction(callback)) callback(); // 不再报错,TypeScript确认此时callback为函数类型 }
额外提示:针对数组检查,也可以直接使用原生的Array.isArray,它本身已经内置了类型守卫定义,无需自定义函数。
内容的提问来源于stack exchange,提问作者Drakinite
相关产品推荐
相关产品推荐

