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

