TypeScript-Guide für Objektschlüssel

Objektschlüssel in TypeScript zu camelCase konvertieren

TypeScript-Anwendungen brauchen bei snake_case-API-Daten oft sowohl Runtime-Transformation als auch eine passende Compile-Time-Form.

Von Camel Case Converter RedaktionVeröffentlicht 12.09.2026Zuletzt geprüft

TypeScript-Implementierung

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>
}

Ein rekursiver Mapped Type kann umbenannte String-Keys und Array-Strukturen beschreiben.

Der Typ ändert keine Netzwerkdaten; eine Runtime-Funktion bleibt zwingend nötig.

Grenzfälle in Produktion

  • Komplexe Akronymregeln können Runtime und Type-Level auseinanderlaufen lassen.
  • Key-Kollisionen sind auch bei korrekt wirkenden Typen ein Runtime-Datenproblem.
  • Symbol-Keys und Nicht-JSON-Instanzen müssen explizit behandelt werden.
  • Wenn Präfixe zur Runtime erhalten bleiben, sollten exakte Typen diese Ausnahmen ggf. ebenfalls abbilden.

Objektschlüssel online testen

Teste rekursive Key-Konvertierung, Top-Level-Modus, Ausschlüsse, _/$-Präfixe und Kollisionen an einem JSON-Objekt.

.json-Datei hier ablegen oder vom Gerät auswählen

Dateien werden nur im Browser gelesen. Maximale Größe: 5 MB.

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

Parsing, Dateilesen, Formatierung und Schlüsselkonvertierung laufen lokal im Browser. JSON wird nicht an einen Conversion-Server gesendet.