# 19458-Snakecase

# 题目描述

Create a SnakeCase<T> generic that turns a string formatted in camelCase into a string formatted in snake_case.

A few examples:

type res1 = SnakeCase<'hello'>; // => "hello"
type res2 = SnakeCase<'userName'>; // => "user_name"
type res3 = SnakeCase<'getElementById'>; // => "get_element_by_id"

# 分析

这个题目在字符转换题中算是非常简单的,遍历一次,遇到大写,转成 _小写 就能完成。

不需要考虑第一个字符,不需要考虑之前的字符,可以说是非常简单了。

# 题解

type cases = [
  Expect<Equal<SnakeCase<'hello'>, 'hello'>>,
  Expect<Equal<SnakeCase<'userName'>, 'user_name'>>,
  Expect<Equal<SnakeCase<'getElementById'>, 'get_element_by_id'>>,
  Expect<
    Equal<
      SnakeCase<'getElementById' | 'getElementByClassNames'>,
      'get_element_by_id' | 'get_element_by_class_names'
    >
  >,
];

type SnakeCase<T> = T extends `${infer F}${infer R}`
  ? F extends Uppercase<F>
    ? `_${Lowercase<F>}${SnakeCase<R>}`
    : `${F}${SnakeCase<R>}`
  : '';

即便是应对题目中的联合类型,由于 T extends `${infer F}${infer R}` 本身就会分发一次,故也不需要做任何调整就能支持

# 知识点

  1. 字符遍历
Last Updated: 2023/5/16 06:00:28