#612β€’Medium

KebabCase

Replace the `camelCase` or `PascalCase` string with `kebab-case`. Learn TypeScript template literal types in this medium-level challenge on TypeScriptPro.

In this medium-level challenge, you'll replace the camelcase or pascalcase string with kebab-case.

Challenge Instructions: KebabCase

Medium

Replace the camelCase or PascalCase string with kebab-case.

FooBarBaz -> foo-bar-baz

For example

type FooBarBaz = KebabCase<"FooBarBaz">
const foobarbaz: FooBarBaz = "foo-bar-baz"
 
type DoNothing = KebabCase<"do-nothing">
const doNothing: DoNothing = "do-nothing"

Change the following code to make the test cases pass (no type check errors).

ChallengeSolution
/* _____________ Your Code Here _____________ */

type KebabCase<S> = any

/* _____________ Test Cases _____________ */
import type { Equal, Expect } from '../helpers'

type cases = [
  Expect<Equal<KebabCase<'FooBarBaz'>, 'foo-bar-baz'>>,
  Expect<Equal<KebabCase<'fooBarBaz'>, 'foo-bar-baz'>>,
  Expect<Equal<KebabCase<'foo-bar'>, 'foo-bar'>>,
  Expect<Equal<KebabCase<'foo_bar'>, 'foo_bar'>>,
  Expect<Equal<KebabCase<'Foo-Bar'>, 'foo--bar'>>,
  Expect<Equal<KebabCase<'ABC'>, 'a-b-c'>>,
  Expect<Equal<KebabCase<'-'>, '-'>>,
  Expect<Equal<KebabCase<''>, ''>>,
  Expect<Equal<KebabCase<'😎'>, '😎

Pro Challenge

Unlock 102+ medium, hard, and extreme challenges to master advanced TypeScript.

One-time payment. Lifetime access.

Video Walkthrough

Detailed Explanation

type KebabCase<S extends string> = S extends `${infer Letter}${infer Rest}`
  ? Rest extends Uncapitalize<Rest>
    ? `${Uncapitalize<Letter>}${KebabCase<Rest>}`
    : `${Uncapitalize<Letter>}-${KebabCase<Rest>}`
  : S

How it works:

This challenge helps you understand TypeScript's advanced type system and how to apply this concept in real-world scenarios.

This challenge is originally from here.

Share this challenge

Learn the Concepts