Wie führe ich TypeScript-Dateien über die Befehlszeile aus?


206

Es fällt mir überraschend schwer, eine Antwort darauf zu finden. Mit Node.JS können Sie jede JS-Datei ausführen node path/to/file.js, mit CoffeeScript ist es coffee hello.coffeeund ES6 hat babel-node hello.js. Wie mache ich dasselbe mit Typescript?

Mein Projekt hat eine, tsconfig.jsondie von Webpack / ts-loader verwendet wird, um ein schönes kleines Bundle für den Browser zu erstellen. Ich muss vorher einen Build-Schritt von der Konsole ausführen, der einige der .tsim Projekt verwendeten Dateien zum Generieren eines Schemas verwendet, aber ich kann anscheinend keine einzelne Typescript-Datei ausführen, ohne sie zu kompilieren das ganze Projekt.

Antworten:


268

Wie mache ich dasselbe mit Typescript?

Sie können die tscAusführung im Überwachungsmodus mit verlassen tsc -w -p .und es werden .jsDateien für Sie live generiert , sodass Sie node foo.jswie gewohnt ausgeführt werden können

TS-Knoten

Es gibt einen ts-Knoten: https://github.com/TypeStrong/ts-node , der den Code im laufenden Betrieb kompiliert und über den Knoten 🌹 ausführt

npx ts-node src/foo.ts

10
tsc schreibt js auf die Festplatte. ts-node muss das nicht tun und führt ts on the fly aus
basarat

1
Nur Erinnerung ts-node konsolidiert kein Protokoll von importierten Modulen. Zum Beispiel: Wenn Sie ts-node fil1.ts sind und file1.ts intern file2.ts verwendet, werden Konsolenprotokolle von file2.ts nicht protokolliert.
Shadab Faiz

1
Ein roter Hering, auf den ich achten musste, traf mich und verwirrte mich. Ich hatte eine einfache TypeScript-Datei mit dem Namen test.ts, die nie transpiliert wurde und die eine einzige Codezeile enthielt: console.log('hello');darin. Ich rannte node test.tsvon der Kommandozeile und es funktionierte die Ausgabe von "Hallo", was mich verwirrte. Nun, wenn die Datei rein gültiges JavaScript ist und Sie sie ausführen node myFile.ts, funktioniert sie immer noch. Dies ist jedoch kein guter Anwendungsfall, da ich in dem Moment, in dem ich TypeScript-Code hinzugefügt habe, beim Versuch, ihn auszuführen, eine Fehlermeldung erhalten habe, was ich erwartet hatte. Ich wünschte, der Knoten würde beim Ausführen von .ts-Dateien alarmieren / Fehler machen.
Atconway

3
ts-Knoten FTW. npm install -g ts-nodemacht ts-node your-script.tsein Kinderspiel.
AlwaysLearning


41

Wir haben folgende Schritte

  1. Zuerst müssen Sie Typoskript installieren

    npm install -g Typoskript

2.Erstellen Sie eine Datei helloworld.ts

function hello(person){
 return "Hello, " + person;
}
let user = "Aamod Tiwari";
const result = hello(user);
console.log("Result",result)

3. Öffnen Sie die Eingabeaufforderung und geben Sie den folgenden Befehl ein

tsc helloworld.ts

  1. Führen Sie den Befehl erneut aus

Knoten helloworld.js

  1. Das Ergebnis wird auf der Konsole angezeigt

2
In Ihrem Fall führen wir die .js-Datei und nicht die .ts-Datei aus.
Menai Ala Eddine - Aladdin

20

Um der obigen Antwort von @Aamod hinzuzufügen: Wenn Sie eine Befehlszeile zum Kompilieren und Ausführen Ihres Codes verwenden möchten, können Sie Folgendes verwenden:

Windows:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gtscCLI
s2t2

1
Ah die Fenster 'Rohr'
Rocky Li

Dies würde nicht funktionieren, wenn Sie Typoskript-Quelle Zeile für Zeile debuggen möchten.
Paramvir Singh Karwal

19

Führen Sie die folgenden Befehle aus und installieren Sie die erforderlichen Pakete global:

npm install -g ts-node
npm install -g typescript

Führen Sie nun den folgenden Befehl aus, um eine Typoskriptdatei auszuführen:

ts-node typescript-file.ts

2
Dies ist meiner Meinung nach der beste Weg, dies zu tun, da ts-nodeauch TypeScript REPL bereitgestellt wird.
Tromgy

1
Sie können sich auch darauf verlassen, npx ts-node yourscript.tswenn Sie keine globale Version verwenden möchten.
Rafaelpivato


6

Nur hilfreiche Informationen - hier ist das neueste TypeScript / JavaScript-Laufzeit- Deno .

Es wurde vom Schöpfer des Knotens Ryan Dahl erstellt, basierend darauf, was er anders machen würde, wenn er neu anfangen könnte.


1
Hier ist ein Beispiel:deno run https://deno.land/std/examples/welcome.ts
Mozey

5

Schreiben Sie sich, ein einfacher Bash-Wrapper kann helfen.

#!/bin/bash
npx tsc $1 && node ${1%%.ts}

3

In keiner der anderen Antworten wird erläutert, wie ein TypeScript-Skript ausgeführt wird, das Module und insbesondere moderne ES-Module verwendet.

Zunächst einmal funktioniert ts-node in diesem Szenario ab März 2020 nicht mehr. Wir werden uns also damit zufrieden geben, tscgefolgt vonnode .

Zweitens kann TypeScript immer noch keine .mjsDateien ausgeben . Also begnügen wir uns mit .jsDateien und "type": "module"inpackage.json .

Drittens möchten Sie klare importLinien, ohne die .jsErweiterung anzugeben (was in .tsDateien verwirrend wäre ):

import { Lib } from './Lib';

Nun, das ist nicht trivial. Für den Knoten müssen beim Import Erweiterungen angegeben werden, es sei denn, Sie verwenden das experimental-specifier-resolution=nodeFlag. In diesem Fall würde es Node ermöglichen, nach zu suchen Lib.jsoder Lib/index.jswenn Sie nur ./Libauf dem angebenimport Zeile .

Viertens gibt es immer noch einen Haken: Wenn Sie einen anderen mainDateinamen als index.jsin Ihrem Paket haben, wird Node ihn nicht finden .

Das Transpilieren macht die Dinge viel chaotischer als das Ausführen von Vanilla Node.

Hier ist ein Beispiel-Repo mit einer modernen TypeScript-Projektstruktur , die ES-Modulcode generiert.


1
Vielen Dank, das ist fast genau die Kette von Problemen, mit denen ich heute konfrontiert war!
7.

3

Wie die Antwort von Zeeshan Ahmad denke ich auch, dass dies ts-nodeder richtige Weg ist. Ich würde auch einen Shebang hinzufügen und ihn ausführbar machen, so dass Sie ihn einfach direkt ausführen können.

  1. Installieren Sie Typoskript und ts-Knoten global:

    npm install -g ts-node typescript

    oder

    yarn global add ts-node typescript
  2. Erstellen Sie eine Datei hellomit diesem Inhalt:

    #!/usr/bin/env ts-node-script
    
    import * as os from 'os'
    
    function hello(name: string) {
        return 'Hello, ' + name
    }
    const user = os.userInfo().username
    console.log(`Result: ${hello(user)}`)

    Wie Sie sehen können, hat Zeile eins den Shebang für ts-Knoten

  3. Führen Sie es direkt aus, indem Sie nur die Datei ausführen

    $ ./hello
    Result: Hello, root

Einige Notizen:


Update 2020-04-06: Einige Änderungen nach großartigen Eingaben in den Kommentaren: Aktualisieren Sie Shebang, um es zu verwenden, ts-node-scriptanstatt ts-nodeauf Probleme in ts-node zu verlinken.



1
Bei diesem Ansatz können viele Probleme auftreten. Ich habe mögliche Lösungen in dieser Ausgabe dokumentiert . Insbesondere der Shebang #!/usr/bin/env ts-node-script(auch ein Teil von ts-node) scheint für diesen Zweck überlegen zu sein. Wenn Sie Ihr Skript verknüpfen möchten (z. B. mit npm link), werden die Dinge komplizierter, da der Skriptmodus von ts-node(noch?) Nicht symbolischen Links folgt. Ich ging #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsonam Ende in meinem Fall mit.
Kaspar Etter

0

Nur für den Fall, dass jemand wie ich verrückt ist und nur ein Typoskript-Skript ausführen möchte, als wäre es ein .js-Skript, können Sie dies versuchen. Ich habe ein Hacky-Skript geschrieben, das anscheinend das .ts-Skript mit node ausführt.

#!/usr/bin/env bash

NODEPATH="$HOME/.nvm/versions/node/v8.11.3/bin" # set path to your node/tsc

export TSC="$NODEPATH/tsc"
export NODE="$NODEPATH/node"

TSCFILE=$1 # only parameter is the name of the ts file you created.

function show_usage() {
    echo "ts2node [ts file]"
    exit 0
}

if [ "$TSCFILE" == "" ]
then
    show_usage;
fi

JSFILE="$(echo $TSCFILE|cut -d"." -f 1).js"

$TSC $TSCFILE && $NODE $JSFILE

Sie können dies tun oder Ihre eigene schreiben, aber im Wesentlichen erstellt es die .js-Datei und verwendet dann den Knoten, um sie wie folgt auszuführen:

# tsrun myscript.ts

Einfach. Stellen Sie einfach sicher, dass Ihr Skript nur ein "." Andernfalls müssen Sie Ihre JSFILE anders ändern als ich es gezeigt habe.


0
  1. Installieren Sie das ts-nodeKnotenmodul global.
  2. Erstellen Sie eine Knotenlaufzeitkonfiguration (für IDE) oder verwenden Sie sie nodein der Befehlszeile, um sie unter der Dateidatei auszuführen js(Der Pfad ist für Windows, aber Sie können dies auch für Linux tun) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Geben Sie Ihren tsDateipfad als Befehlszeilenargument an.
  4. Führen Sie aus oder debuggen Sie, wie Sie möchten.

-27

Diese Frage wurde im Jahr 2015 gestellt. Im Jahr 2018 erkennt der Knoten sowohl .js als auch .ts . Laufen node file.tsläuft also auch.


19
Der Knoten interpretiert jede Datei als Javascript, sodass sie nur funktioniert, wenn die betreffende Typoskriptdatei selbst eine gültige Javascript-Datei ist.
Preda7or

Dies funktioniert, wenn der Dateiinhalt gültiges Javascript ist, die Erweiterung jedoch ts ist. Node ist es egal, wie die Erweiterung lautet, solange der Inhalt gültiges Javascript ist.
SnnSnn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.