TypeScript erobert die Kommandozeile: Das Ende von Bash?
Eine CLI-Anwendung mit TypeScript erstellen – was zunächst nach einer Schnapsidee klingt, bietet in der Praxis Vorteile gegenüber klassischen Bash-Skripten.
- Timo Zander
JavaScript und die typsichere Schwestersprache TypeScript scheinen in ihrer Beliebtheit unaufhaltsam zu sein. Ganz gleich, ob in der Frontend- oder Backend-Entwicklung, die Sprachen sind mittlerweile die erste Wahl vieler Entwicklerinnen und Entwickler. So ist es nicht verwunderlich, dass Developer CLI-Skripte – typischerweise in Bash, PowerShell oder Python geschrieben – auch immer häufiger mit TypeScript erstellen.
Eine Web-Skriptsprache zum Erstellen von Shell-Anwendungen zu nutzen, scheint abwegig. Doch dank der Node-Laufzeitumgebung ist TypeScript plattformunabhängig, weitverbreitet und besitzt eine umfangreiche Standardbibliothek. Zudem gehören viele Pakete zum Ökosystem, die das Erstellen von CLI-Anwendungen vereinfachen. Die Einstiegshürde ist somit gering – ganz im Gegensatz zu Bash, einer Skriptsprache, die immer wieder für ihre Eigenheiten, Schwierigkeit und unlesbare Syntax gerügt wird.
Aus Bash wird JavaScript
Größere Softwareprojekte nutzen oft individuelle Skripte für ihren Workflow: etwa für das Aufsetzen der Umgebung, für den Build oder das Generieren von Code. Wenn diese Projekte in JavaScript oder TypeScript verfasst sind, werden solche Skripte immer häufiger in derselben Sprache geschrieben. Entwicklerinnen und Entwickler müssen so nicht zwischen verschiedenen Sprachen und Kontexten wechseln, und können ihr erlerntes Wissen über JavaScript auch auf die nötigen CLI-Skripte übertragen. Projekte wie Pulumi, ein Open-Source-Tool für Infrastruktur als Code, unterstreichen diese Vorteile: Anstatt eigene, nur für diesen Einsatzzweck genutzte Sprachen zu erlernen, können Entwicklerinnen und Entwickler mithilfe von Pulumi ihre Infrastructure-as-Code mit der Lieblings-Allzwecksprache verfassen.
Gleichzeitig sind in JavaScript geschriebene Skripte plattformunabhängig. Node.js oder eine Node.js-kompatible Laufzeitumgebung haben nahezu alle Developer auf ihrem Rechner, ob auf Windows, Mac oder Linux. Ein Bash-Skript sorgt hingegen bei Windows-Nutzern für Probleme und braucht Hilfsmittel wie MinGW (eine Portierung der Entwicklerwerkzeuge GNU Compiler Collection und GNU Debugger für Windows) oder das Windows Subsystem for Linux (WSL).
Alternativ lässt sich auch die Schwestersprache TypeScript nutzen. Die Node.js-Konkurrenten Deno und Bun unterstützen die Ausführung von TypeScript-Code sogar nativ – und auch Node.js hat seit Version 22.7 eine eingebaute Unterstützung für TypeScript, die allerdings noch experimentell ist. Um eine TypeScript-CLI-Anwendung somit einer breiten Zielgruppe verfügbar zu machen, helfen Pakete wie tsx oder ts-node. Diese kombinieren den Build- und Ausführungsschritt, sodass sich TypeScript-Code mithilfe eines einzigen Kommandos ausführen lässt. Das npx-Tool, das der Node.js-Installation beiliegt, kann diese Pakete ohne manuelle Installation aufrufen. Ein Skript lässt sich via npx tsx ./script.ts
ausfĂĽhren. Oder die Datei wird mit einem Shebang (#!
) versehen (Listing 1), sodass das Ausführen direkt möglich ist (via ./script.ts
).
Listing 1: Mithilfe eines Shebangs lässt sich eine .ts-Datei direkt ausführen
#!/usr/bin/env -S npx tsx
import { Command } from "@commander-js/extra-typings";
// ...
Dieses Shebang signalisiert, dass dieses Skript mithilfe des npx tsx
-Kommandos ausgeführt wird. Zusätzlich benötigt die Datei noch Ausführungsrechte und es muss eine Node.js-Installation auf dem Rechner vorhanden sein, sodass npx installiert und in der Umgebung verfügbar ist. Allerdings lassen nicht alle Unix- beziehungsweise Unix-ähnlichen Systeme Argumente im Shebang zu: In diesen Fällen ist die Ausführung etwas umständlicher.