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
相关产品推荐
相关产品推荐

