Создание CLI-приложений на TypeScript: обзор фреймворков и инструментов

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

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

Начать курс

CLI фреймворки для TypeScript: создаём мощные консольные приложения

Разработка интерфейсов командной строки (CLI) на TypeScript — это не просто написание парсера аргументов. Современные CLI-приложения могут быть интерактивными, цветными, поддерживать автодополнение и даже отображать анимированные графики. Для этого существуют специализированные фреймворки и библиотеки. В этой статье мы разберём четыре ключевых инструмента для создания CLI на TypeScript: Commander.js, Ink, Oclif и Yargs. Вы узнаете их сильные стороны, получите готовые примеры кода и поймёте, какой инструмент подходит для вашей задачи.

1. Commander.js — классика и простота

Commander.js — это самый популярный фреймворк для создания CLI на Node.js и TypeScript. Он предлагает декларативный API для описания команд, аргументов и опций. Благодаря встроенной поддержке TypeScript, вы получаете автодополнение и проверку типов.

Основные возможности:

  • Автоматическая генерация справки (--help).
  • Поддержка вложенных команд (субкоманды).
  • Валидация обязательных аргументов.
  • Гибкая система опций: булевы, строковые, с значениями по умолчанию.

Пример простого CLI на Commander.js + TypeScript:

import { Command } from 'commander';

const program = new Command();

program
  .name('greet')
  .description('CLI для приветствия')
  .version('1.0.0');

program
  .command('hello')
  .argument('<name>', 'Имя пользователя')
  .option('-l, --lang <language>', 'Язык приветствия', 'ru')
  .action((name, options) => {
    if (options.lang === 'en') {
      console.log(`Hello, ${name}!`);
    } else {
      console.log(`Привет, ${name}!`);
    }
  });

program.parse(process.argv);

Commander.js идеален для простых утилит и скриптов автоматизации. Он не перегружен лишними зависимостями и хорошо документирован.

2. Ink — реактивный CLI с компонентами

Ink — это уникальный фреймворк, который позволяет строить CLI-интерфейсы с помощью React-подобных компонентов. Вы пишете на JSX, а Ink рендерит это в терминал. В сочетании с TypeScript вы получаете строгую типизацию компонентов.

Ключевые особенности:

  • Компонентный подход: <Text>, <Box>, <Spacer>.
  • Автоматическое обновление при изменении состояния (реактивность).
  • Поддержка анимации, индикаторов загрузки, прогресс-баров.
  • Глубокая интеграция с React-хуками (useInput, useApp).

Пример интерактивного CLI с Ink:

import React, { useState } from 'react';
import { render, Text, Box, useInput } from 'ink';

const Counter = () => {
  const [count, setCount] = useState(0);

  useInput((input) => {
    if (input === '+') setCount(prev => prev + 1);
    if (input === '-') setCount(prev => prev - 1);
  });

  return (
    <Box>
      <Text>Счётчик: {count}. Нажмите '+' или '-'</Text>
    </Box>
  );
};

render(<Counter />);

Ink подходит для сложных интерактивных утилит, мастеров установки, дашбордов в терминале. Это лучший выбор, если вам нужен красивый и отзывчивый интерфейс.

3. Oclif — фреймворк для масштабируемых CLI

Oclif (Open CLI Framework) от Heroku — это полноценный фреймворк для создания CLI-приложений любой сложности. Он поддерживает плагины, автоматическое обновление, хуки и генерацию проектов.

Сильные стороны:

  • Встроенный генератор кода (oclif generate).
  • Поддержка TypeScript из коробки.
  • Система плагинов для расширения функциональности.
  • Автоматическое обновление CLI через npm.

Пример команды в Oclif:

import {Command, Flags} from '@oclif/core';

export class HelloCommand extends Command {
  static description = 'Приветствие пользователя';

  static flags = {
    name: Flags.string({char: 'n', description: 'Ваше имя', required: true}),
  };

  async run(): Promise<void>                    

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