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

TypeScript中isType类型守卫函数箭头语法与实现含义解析

多层箭头类型判断函数逻辑拆解

首先贴出完整的TypeScript源码:

const isType = <T>(type: string) => (obj: unknown): obj is T =>  toString.call(obj) === `[object ${type}]`

这段代码是典型的柯里化写法,三层箭头对应不同的执行阶段,具体作用拆分如下:

  • 第一层箭头:const isType = <T>(type: string) =>
    这是工具函数的入口,接收泛型参数T和字符串类型的入参type(即要判断的目标类型名称,比如Array/String/Null等)。这一层执行后不会直接返回判断结果,而是返回一个绑定了目标检测类型的专属判断函数,方便复用。比如执行const isArray = isType<Array>('Array'),就能得到一个专门检测值是否为数组的函数,不用每次检测都重复传入类型字符串。
  • 第二层箭头结构:(obj: unknown): obj is T =>
    这是第一层返回的专属判断函数的定义部分:接收待检测的参数obj,类型标记为unknown(代表任意未知类型的值);返回值标注的obj is T是TypeScript的类型谓词语法,属于类型保护的一种——如果这个函数返回true,TypeScript会自动把入参obj的类型收窄为之前传入的泛型T,不需要开发者额外写类型断言。
  • 第二层箭头后的核心判断逻辑:toString.call(obj) === [object ${type}]``
    这部分是实际执行类型检测的代码,逻辑并不复杂:
    1. 这里的toString是Object.prototype上的原生toString方法(代码上下文中一般会提前保存这个方法的引用,避免全局污染),通过call把方法内的this绑定到待检测的obj上,会返回固定格式的类型标签字符串:比如检测数组返回[object Array]、检测null返回[object Null]、检测Set返回[object Set]。这种判断方式比typeof、instanceof兼容性更好,不会出现跨执行上下文(比如跨iframe)时原型链不一致导致的判断错误,也能正确识别null、undefined这类特殊值。
    2. 等式右侧是ES6模板字符串,会把第一层传入的type参数拼接成[object 目标类型]的格式,和左侧toString返回的类型标签做全等比较,最终返回true/false作为类型判断的结果。

实际使用参考:

// 预生成常用类型判断函数
const isString = isType<string>('String')
const isNull = isType<null>('Null')
const isSet = isType<Set<unknown>>('Set')

// 直接调用即可
isString('test') // 返回true,TS会自动将入参类型收窄为string
isNull(null) // 返回true
isSet(new Set()) // 返回true

内容的提问来源于stack exchange,提问作者cui

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:45:31