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

TypeScript如何定义排除Function的Record<string, any>类型

问题场景

现有代码存在类型校验漏洞,具体场景如下:

  • 事件收集器函数初始定义:
const track = (data: Record<string, any>) => {
  // 埋点上报逻辑
}
  • 业务侧通用的数据生成函数:
const genData = () => ({
  name: 'x'
})
  • 问题表现:当前类型定义下,track既可以合法接收genData()的执行返回值,也不会对直接传入genData函数本身的错误用法抛出警告,很容易在开发时漏写函数调用括号引发线上问题。需要调整track的类型规则,让它接收到任意Function类型参数时直接抛出类型错误。
实现方案

问题根源是TypeScript中函数本质属于特殊对象,满足Record<string, any>的结构校验,因此不会被拦截。直接通过泛型+条件类型构造禁止函数入参的校验规则即可:

// 泛型工具:传入类型为函数时返回never(触发类型报错),否则返回原类型
type BanFunction<T> = T extends Function ? never : T;

const track = <T extends Record<string, any>>(data: BanFunction<T>) => {
  // 原有埋点上报逻辑
}

调整后校验效果:

  • 合法传参:执行track(genData())时传入普通数据对象,类型校验正常通过,无警告
  • 错误传参:执行track(genData)直接传入函数时,TypeScript会立刻抛出类型不匹配错误,提前拦截问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:12:16