Arbeit mit YAML in TypeScript: Parsen, Generieren und Validieren
\n\nYAML (YAML Ain't Markup Language) ist eines der beliebtesten Daten-Serialisierungsformate, das häufig in Konfigurationsdateien, DevOps (Docker, Kubernetes, Ansible) und CI/CD-Pipelines verwendet wird. Im TypeScript-Ökosystem wird für die Arbeit mit YAML die Bibliothek js-yaml verwendet, die die vollständige Unterstützung der YAML 1.2-Spezifikation bietet, einschließlich komplexer Strukturen, Tags und benutzerdefinierter Datentypen.
Installation und Einrichtung
\n\nInstallieren Sie zunächst die Bibliothek und ihre Typen über npm:
\n\nnpm install js-yaml\nnpm install --save-dev @types/js-yaml\n\nNach der Installation können Sie die Bibliothek in Ihr TypeScript-Projekt importieren:
\n\nimport * as yaml from 'js-yaml';\nimport * as fs from 'fs';\n\nYAML in TypeScript parsen
\n\nDie Hauptfunktion zum Lesen von YAML ist yaml.load(), die einen YAML-String in ein JavaScript/TypeScript-Objekt umwandelt. Betrachten wir ein Beispiel mit einer Konfigurationsdatei:
// config.yaml\n// server:\n// port: 3000\n// host: "localhost"\n// database:\n// url: "mongodb://localhost:27017/mydb"\n// poolSize: 10\n// features:\n// - logging\n// - authentication\n\ninterface Config {\n server: {\n port: number;\n host: string;\n };\n database: {\n url: string;\n poolSize: number;\n };\n features: string[];\n}\n\nconst yamlContent = fs.readFileSync('config.yaml', 'utf8');\nconst config = yaml.load(yamlContent) as Config;\n\nconsole.log(config.server.port); // 3000\nconsole.log(config.features); // ['logging', 'authentication']\n\nVerwenden Sie für sicheres Parsen (ohne Codeausführung) yaml.load() – es ist sicherer als yaml.eval(), das beliebigen JavaScript-Code ausführen kann.
YAML aus TypeScript-Objekten generieren
\n\nDie umgekehrte Operation – die Umwandlung eines TypeScript-Objekts in einen YAML-String – wird mit der Funktion yaml.dump() durchgeführt. Dies ist nützlich, um Konfigurationsdateien dynamisch zu erstellen:
interface DeploymentConfig {\n apiVersion: string;\n kind: string;\n metadata: { name: string; labels?: Record<string, string> };\n spec: { replicas: number; selector: Record<string, string> };\n}\n\nconst deployment: DeploymentConfig = {\n apiVersion: 'apps/v1',\n kind: 'Deployment',\n metadata: {\n name: 'my-app',\n labels: { app: 'my-app', tier: 'backend' }\n },\n spec: {\n replicas: 3,\n selector: { matchLabels: { app: 'my-app' } }\n }\n};\n\nconst yamlString = yaml.dump(deployment, {\n indent: 2,\n lineWidth: 120,\n noRefs: true,\n sortKeys: true\n});\n\nconsole.log(yamlString);\n// apiVersion: apps/v1\n// kind: Deployment\n// metadata:\n// labels:\n// app: my-app\n// tier: backend\n// name: my-app\n// spec:\n// replicas: 3\n// selector:\n// matchLabels:\n// app: my-app\n\nArbeit mit benutzerdefinierten Typen
\n\nDie Bibliothek js-yaml unterstützt benutzerdefinierte Schemata und Datentypen. Dies ist besonders nützlich bei der Arbeit mit Daten, regulären Ausdrücken oder speziellen Objekten:
import * as yaml from 'js-yaml';\n\n// Erstellen eines benutzerdefinierten Typs für Daten\nconst DateType = new yaml.Type('!date', {\n kind: 'scalar',\n resolve: (data: string) => !isNaN(Date.parse(data)),\n construct: (data: string) => new Date(data),\n instanceOf: Date,\n represent: (date: Date) => date.toISOString()\n});\n\n// Erstellen eines Schemas mit Unterstützung für Standard- und benutzerdefinierte Typen\nconst schema = yaml.DEFAULT_SCHEMA.extend([DateType]);\n\nconst yamlWithDates = `\nevent: !date 2024-12-25T10:00:00Z\ntitle: "Weihnachtsseminar"\n`;\n\nconst parsed = yaml.load(yamlWithDates, { schema });\nconsole.log(parsed.event instanceof Date); // true\nconsole.log(parsed.event.toLocaleDateString('de-DE')); // 25.12.2024\n\nYAML validieren mit
Auch in der Bibliothek
Arbeiten mit XML in Java: DOM, SAX, StAX und JAXB
Laravel Telescope für PHP: Komplette Anleitung mit Beispielen
E-Mail-Versand in Swift (iOS/macOS): MFMailComposeViewController und SMTP
Security Crypto für Kotlin: Komplettguide mit Beispielen