Работа с YAML в TypeScript: полное руководство по парсингу и сериализации

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с YAML в TypeScript: парсинг, сериализация и практические примеры

YAML (YAML Ain't Markup Language) — это популярный формат сериализации данных, который часто используется для конфигурационных файлов, описания API и хранения структурированных данных. В экосистеме TypeScript существует несколько надежных инструментов для работы с YAML. В этой статье мы подробно рассмотрим библиотеку js-yaml, которая является де-факто стандартом для парсинга и сериализации YAML в TypeScript-проектах.

Установка и настройка

Для начала работы необходимо установить библиотеку js-yaml и её TypeScript-тайпинги:

npm install js-yaml
npm install --save-dev @types/js-yaml

После установки вы можете импортировать библиотеку в свой проект:

import * as yaml from 'js-yaml';
import * as fs from 'fs';

Основные возможности библиотеки js-yaml

  • Парсинг YAML в объекты TypeScript — преобразование YAML-строки в типизированные структуры данных
  • Сериализация объектов в YAML — обратное преобразование TypeScript-объектов в YAML-формат
  • Поддержка кастомных типов — возможность определять собственные YAML-теги
  • Валидация схем — проверка корректности структуры YAML-документа
  • Работа с файлами — чтение и запись YAML-файлов через Node.js

Парсинг YAML в TypeScript

Библиотека js-yaml предоставляет два основных метода для парсинга: yaml.load() и yaml.safeLoad(). Рекомендуется использовать safeLoad() для предотвращения выполнения потенциально опасного кода:

import * as yaml from 'js-yaml';

const yamlString = `
name: PythonLib
version: 1.0.0
features:
  - parsing
  - serialization
  - validation
metadata:
  author: Developer
  created: 2024-01-15
`;

interface Config {
  name: string;
  version: string;
  features: string[];
  metadata: {
    author: string;
    created: string;
  };
}

const config: Config = yaml.load(yamlString) as Config;
console.log(config.name); // PythonLib
console.log(config.features); // ['parsing', 'serialization', 'validation']

Сериализация объектов в YAML

Для преобразования TypeScript-объекта обратно в YAML используется метод yaml.dump():

import * as yaml from 'js-yaml';

interface ServerConfig {
  host: string;
  port: number;
  ssl: boolean;
  paths: {
    static: string;
    uploads: string;
  };
}

const serverConfig: ServerConfig = {
  host: 'localhost',
  port: 3000,
  ssl: false,
  paths: {
    static: './public',
    uploads: './uploads'
  }
};

const yamlOutput = yaml.dump(serverConfig, {
  indent: 2,
  lineWidth: 80,
  noRefs: true
});

console.log(yamlOutput);
/*
host: localhost
port: 3000
ssl: false
paths:
  static: ./public
  uploads: ./uploads
*/

Работа с YAML-файлами в Node.js

Часто требуется загрузить конфигурацию из внешнего YAML-файла. Вот как это сделать с использованием модуля fs:

import * as yaml from 'js-yaml';
import * as fs from 'fs';
import * as path from 'path';

interface DatabaseConfig {
  host: string;
  port: number;
  database: string;
  username: string;
  password: string;
}

function loadYamlConfig<T>(filePath: string): T {
  try {
    const fileContent = fs.readFileSync(path.resolve(filePath), 'utf8');
    return yaml.load(fileContent) as T;
  } catch (error) {
    console.error(`Ошибка загрузки YAML-файла: ${filePath}`, error);
    throw error;
  }
}

// Использование
const dbConfig = loadYamlConfig<DatabaseConfig>('./config/database.yaml');
console.log(`Подключение к ${dbConfig.host}:${dbConfig.port}/${dbConfig.database}`);

Валидация YAML с помощью TypeScript

Для обеспечения типобезопасности можно использовать библиотеку zod или io-ts для валидации распарсенных YAML-данных:

import * as yaml from 'js-yaml';
import { z } from 'zod';

const AppConfigSchema = z.object({
  app: z.object({
    name: z.string().min(1),
    version: z.string().regex(/^\d+\.\d+\.\d+$/),
    debug: z.boolean().default(false)
  }),
  database: z.object                    

Рекомендаций