Guide des clés d’objet en TypeScript

Convertir les clés d’objet en camelCase en TypeScript

Les applications TypeScript ont souvent besoin à la fois d’une transformation runtime et d’une forme de type correspondante.

Par Équipe éditoriale Camel Case ConverterPublié le 12 sept. 2026Dernière relecture

Implémentation TypeScript

type CamelCase<S extends string> =
  S extends `${infer Head}_${infer Tail}`
    ? `${Lowercase<Head>}${Capitalize<CamelCase<Tail>>}`
    : Uncapitalize<S>

type Camelize<T> =
  T extends readonly (infer Item)[] ? Camelize<Item>[] :
  T extends Record<string, unknown> ? { [K in keyof T as K extends string ? CamelCase<K> : K]: Camelize<T[K]> } : T

function toCamelKey(key: string) {
  return key.replace(/[-_]+([a-zA-Z0-9])/g, (_, char: string) => char.toUpperCase())
}

function keysToCamel<T>(value: T): Camelize<T> {
  if (Array.isArray(value)) return value.map(keysToCamel) as Camelize<T>
  if (value === null || typeof value !== "object") return value as Camelize<T>
  const output: Record<string, unknown> = {}
  for (const [key, child] of Object.entries(value)) {
    const nextKey = toCamelKey(key)
    if (Object.hasOwn(output, nextKey)) throw new Error(`Key collision: ${nextKey}`)
    output[nextKey] = keysToCamel(child)
  }
  return output as Camelize<T>
}

Un mapped type récursif peut décrire les clés renommées et conserver la structure des tableaux.

Le type ne transforme aucune donnée réseau ; la fonction runtime reste indispensable.

Cas limites en production

  • Des règles d’acronymes complexes peuvent faire diverger runtime et type-level.
  • Les collisions de clés restent un problème de données runtime.
  • Les symboles et instances non JSON doivent être gérés explicitement.
  • Si des préfixes sémantiques sont conservés au runtime, reflétez-les dans les types si nécessaire.

Tester les clés d’objet en ligne

Collez un objet JSON pour tester la conversion récursive, le niveau supérieur, les exclusions, les préfixes _/$ et les collisions.

Déposez un fichier .json ou choisissez-en un sur votre appareil

Les fichiers sont lus uniquement dans votre navigateur. Taille maximale : 5 Mo.

JSON converti
{
  "userProfile": {
    "firstName": "Ada",
    "createdAt": "2026-09-12"
  }
}

Analyse, lecture de fichier, formatage et conversion s’exécutent localement dans votre navigateur. Le JSON n’est pas envoyé à un serveur de conversion.