如何自定义TypeScript的Kebabcase等字符串类型工具?
自定义TypeScript字符串格式转换类型工具
可以实现这类自定义字符串类型转换工具,虽然无法复用Uppercase/Capitalize等内置工具的编译器原生逻辑,但可以利用TypeScript的条件类型、递归类型和模板字面量类型手动实现。
以下是几种常见格式的具体实现:
1. PascalCase(大驼峰式,首字母大写,无分隔符)
type PascalCase<S extends string> = S extends `${infer Prefix}-${infer Suffix}` ? `${Capitalize<PascalCase<Prefix>>}${Capitalize<PascalCase<Suffix>>}` : S extends `${infer Prefix}_${infer Suffix}` ? `${Capitalize<PascalCase<Prefix>>}${Capitalize<PascalCase<Suffix>>}` : Capitalize<S>; // 示例: type TestPascal = PascalCase<'hello-world_type'>; // 结果:"HelloWorldType"
逻辑:递归识别短横线/下划线分隔符,将每个分段首字母大写后拼接,最后统一处理整个字符串的首字母大写。
2. CamelCase(小驼峰式,首字母小写,后续单词首字母大写)
type CamelCase<S extends string> = S extends `${infer Prefix}-${infer Suffix}` ? `${Lowercase<Prefix>}${Capitalize<CamelCase<Suffix>>}` : S extends `${infer Prefix}_${infer Suffix}` ? `${Lowercase<Prefix>}${Capitalize<CamelCase<Suffix>>}` : Lowercase<S>; // 示例: type TestCamel = CamelCase<'HELLO-WORLD_TYPE'>; // 结果:"helloWorldType"
逻辑:递归拆分分隔符,首段转为小写,后续分段首字母大写、其余部分小写后拼接。
3. SnakeCase(蛇形命名,下划线分隔,全小写)
type SnakeCase<S extends string> = S extends `${infer First}${infer Rest}` ? First extends Uppercase<First> ? `_${Lowercase<First>}${SnakeCase<Rest>}` : `${First}${SnakeCase<Rest>}` : S; // 示例: type TestSnake = SnakeCase<'HelloWorldType'>; // 结果:"hello_world_type"
逻辑:递归遍历字符串,遇到大写字母时先添加下划线再转为小写,其余字符直接保留小写格式。
4. KebabCase(短横线命名,短横线分隔,全小写)
type KebabCase<S extends string> = S extends `${infer First}${infer Rest}` ? First extends Uppercase<First> ? `-${Lowercase<First>}${KebabCase<Rest>}` : `${First}${KebabCase<Rest>}` : S; // 示例: type TestKebab = KebabCase<'HelloWorldType'>; // 结果:"hello-world-type"
逻辑:与SnakeCase逻辑类似,仅将分隔符替换为短横线,遇到大写字母时添加短横线并转小写。
注意事项
- 这些实现依赖TypeScript 4.1及以上版本的模板字面量类型支持。
- 若需处理复杂混合分隔符场景,可在条件判断中扩展更多分隔符类型。
- 内置工具如
Capitalize/Lowercase可直接在自定义类型中调用,其编译器原生实现不影响我们基于上层逻辑构建自定义转换。
内容的提问来源于stack exchange,提问作者arnaudpf
相关产品推荐
相关产品推荐

