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

TypeScript如何限制函数参数的对象仅允许string类型的键

解决方案

你当前的写法不生效,是因为 TypeScript 中 Record<string, unknown> 存在类型兼容特性:数字类型的键会被自动识别为可转换为字符串的合法类型,Symbol 类型的键也不会被该约束拦截,因此无法实现你要的校验效果。

你可以通过对泛型入参的键类型做额外校验实现需求,修改后的代码如下:

const func = <Arg extends Record<string, unknown>>(
  arg: Exclude<keyof Arg, string> extends never ? Arg : never
) => {
  return arg
}

实现原理

  • 用 keyof Arg 取出传入参数对象所有键的联合类型
  • 用 Exclude<keyof Arg, string> 过滤掉所有字符串类型的键,只要剩余的类型不是空(即存在非字符串类型的键),就将参数标记为 never 类型,触发 TypeScript 报错。

校验效果

修改后调用函数时会完全符合你的预期:

  • 合法场景:字符串字面量键、无引号的字符串键、数字字符串键都可以正常通过校验
  • 非法场景:数字键、Symbol 键都会触发类型错误,无法通过编译。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:39:05