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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:40:30