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

TypeScript如何正确为蛇形转驼峰函数编写类型定义解决报错

问题根因

TypeScript 标准库中String.prototype.replace方法的返回值类型固定为通用string,无法自动推导出和你自定义的SnakeToCamelCase<T>条件类型对应的精确类型,因此会抛出string不能赋值给SnakeToCamelCase<T>的错误。

解决方案

直接对返回结果做类型断言即可,你已经保证了运行时转换逻辑和SnakeToCamelCase的类型定义逻辑一致,这个断言是安全无风险的。

如果仅需要支持下划线蛇形命名转驼峰,完整代码如下:

type SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`
  ? `${Lowercase<T>}${Capitalize<SnakeToCamelCase<U>>}`
  : S;

const snakeToCamelCase = <T extends string>(subject: T): SnakeToCamelCase<T> => {
  return subject.replace(/(_[a-z])/gi, (segment) => {
    return segment.toUpperCase().replace('_', '');
  }) as SnakeToCamelCase<T>;
};

如果需要同时支持下划线蛇形、中划线短横线命名转驼峰,需要同步调整类型定义,保证运行时逻辑和类型规则一致:

type SnakeOrKebabToCamelCase<S extends string> = S extends `${infer T}_${infer U}` | `${infer T}-${infer U}`
  ? `${Lowercase<T>}${Capitalize<SnakeOrKebabToCamelCase<U>>}`
  : S;

const snakeOrKebabToCamelCase = <T extends string>(subject: T): SnakeOrKebabToCamelCase<T> => {
  return subject.replace(/([_-][a-z])/gi, (segment) => {
    return segment.toUpperCase().replace('-', '').replace('_', '');
  }) as SnakeOrKebabToCamelCase<T>;
};
效果验证
// 类型会被正确推导为 'userId'
const userId = snakeToCamelCase('user_id');
// 类型会被正确推导为 'userAddress'
const userAddress = snakeOrKebabToCamelCase('user-address');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:54:06