Jak uruchomić pliki TypeScript z wiersza poleceń?


206

Zaskakująco trudno mi znaleźć odpowiedź na to pytanie. W zwykłym Node.JS możesz uruchamiać dowolny plik js node path/to/file.jsprzy pomocy CoffeeScript coffee hello.coffeei ES6 babel-node hello.js. Jak zrobić to samo z maszynowym skryptem maszynowym?

Mój projekt ma taki, tsconfig.jsonktóry jest używany przez Webpack / ts-loader do budowy ładnego małego pakietu dla przeglądarki. Przedtem potrzebuję jednak kroku kompilacji uruchomionego z konsoli, który wykorzystałby niektóre .tspliki użyte w projekcie do wygenerowania schematu, ale nie wydaje mi się, żebym mógł uruchomić jednego pliku Typescript bez kompilacji cały projekt.

Odpowiedzi:


268

Jak zrobić to samo z maszynowym skryptem maszynowym

Możesz wyjść tscz trybu oglądania za pomocą, tsc -w -p .a on wygeneruje .jsdla Ciebie pliki na żywo, dzięki czemu możesz działać node foo.jsnormalnie

Węzeł TS

Istnieje ts-node: https://github.com/TypeStrong/ts-node , który skompiluje kod w locie i uruchomi go przez węzeł 🌹

npx ts-node src/foo.ts

10
tsc zapisuje js na dysk. ts-node nie musi tego robić i uruchamia ts w locie
basarat

1
tylko przypomnienie ts-node nie konsoluje logów z importowanych modułów. Na przykład: jeśli jesteś węzłem ts plik1.ts, a plik1.ts używa pliku file2.ts wewnętrznie, dzienniki konsoli z pliku2.ts nie zostaną zarejestrowane.
Shadab Faiz

1
Jeden czerwony śledź, aby uważać na to, na co wpadłem i mnie mylił. Miałem prosty plik TypeScript o nazwie, test.tsktóry nigdy nie był transpilowany i zawierałem pojedynczy wiersz kodu: console.log('hello');w nim. Biegałam node test.tsz linii poleceń i to działało wyprowadzania „hello` które było niejasne mnie. Cóż, jeśli plik ma wyłącznie prawidłowy kod JavaScript, a node myFile.tsjego uruchomienie nadal działa. Jednak nie jest to dobry przypadek użycia, ponieważ w chwili dodania kodu TypeScript wystąpił błąd przy próbie uruchomienia tego, czego się spodziewałem. Chciałbym, aby węzeł ostrzegał / powodował błąd po uruchomieniu plików .ts.
atconway

3
węzeł ts FTW. npm install -g ts-nodesprawia, że ts-node your-script.tswiatr.
AlwaysLearning


41

Mamy następujące kroki

  1. Najpierw musisz zainstalować maszynopis

    npm install -g maszynopis

2. Utwórz jeden plik helloworld.ts

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

3. Otwórz wiersz polecenia i wpisz następujące polecenie

tsc helloworld.ts

  1. Ponownie uruchom polecenie

węzeł helloworld.js

  1. Wynik zostanie wyświetlony na konsoli

2
W twoim przypadku uruchamiamy plik .js, a nie plik .ts.
Menai Ala Eddine - Aladdin

20

Aby dodać do powyższej odpowiedzi @Aamod, jeśli chcesz użyć jednego wiersza polecenia do skompilowania i uruchomienia kodu, możesz użyć następujących opcji:

Windows:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gzainstalować tscCLI
s2t2

1
Ach, „fajka” systemu Windows
Rocky Li

To nie zadziałałoby, jeśli chcesz debugować źródło maszynowe wiersz po wierszu.
Paramvir Singh Karwal

20

Uruchom poniższe polecenia i zainstaluj wymagane pakiety globalnie:

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

Teraz uruchom następujące polecenie, aby uruchomić plik maszynopisu:

ts-node typescript-file.ts

2
jest to najlepszy sposób, aby to zrobić IMHO, ponieważ ts-nodezapewnia także REPL do TypeScript.
tromgy

1
Możesz także polegać na npx ts-node yourscript.tstym, że nie chcesz używać wersji globalnej.
rafaelpivato


6

Po prostu pomocne informacje - oto najnowsze środowisko uruchomieniowe TypeScript / JavaScript Deno .

Został stworzony przez twórcę węzła Ryana Dahla na podstawie tego, co zrobiłby inaczej, gdyby mógł zacząć od nowa.


1
Oto przykład:deno run https://deno.land/std/examples/welcome.ts
mozey

5

Napisz sobie proste opakowanie bash może pomóc.

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

3

Żadna z pozostałych odpowiedzi nie omawia sposobu uruchamiania skryptu TypeScript używającego modułów, a zwłaszcza nowoczesnych modułów ES.

Po pierwsze, ts-node nie działa w tym scenariuszu, począwszy od marca 2020 r. Więc zadowalamy się tscpóźniej node.

Po drugie, TypeScript nadal nie może wyprowadzać .mjsplików . Więc będziemy godzić się na .jsplikach i "type": "module"w package.json.

Po trzecie, chcesz mieć czyste importlinie bez określania .jsrozszerzenia (co byłoby mylące w .tsplikach):

import { Lib } from './Lib';

To nie jest trywialne. Węzeł wymaga określenia rozszerzeń przy imporcie, chyba że użyjesz experimental-specifier-resolution=nodeflagi. W takim przypadku umożliwiłoby Węzłu wyszukiwanie Lib.jslub Lib/index.jspodanie tylko ./Libw importwierszu.

Po czwarte, wciąż istnieje problem: jeśli masz inną mainnazwę pliku niż index.jsw pakiecie, Node go nie znajdzie .

Przeniesienie sprawia, że ​​jest dużo bardziej bałagan niż uruchamianie węzła waniliowego.

Oto przykładowe repozytorium z nowoczesną strukturą projektu TypeScript , generujące kod ES Module.


1
Wielkie dzięki, to prawie dokładnie ten sam problem, z jakim się spotkałem, próbując to zrobić dzisiaj!
dgellow

3

Podobnie jak odpowiedź Zeeshana Ahmada , myślę, że ts-nodejest to właściwa droga. Dodałbym również shebang i uczynię go wykonywalnym, abyś mógł po prostu uruchomić go bezpośrednio.

  1. Zainstaluj globalnie maszynopis i ts-node:

    npm install -g ts-node typescript

    lub

    yarn global add ts-node typescript
  2. Utwórz plik helloo tej treści:

    #!/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)}`)

    Jak widać, pierwsza linia ma shebang dla ts-node

  3. Uruchom bezpośrednio, po prostu wykonując plik

    $ ./hello
    Result: Hello, root

Niektóre uwagi:


Aktualizacja 2020-04-06: Niektóre zmiany po świetnym wprowadzeniu w komentarzach: Zaktualizuj shebang, aby użyć ts-node-scriptzamiast ts-nodelinku do problemów w węźle ts.



1
Przy takim podejściu możesz napotkać wiele problemów. Udokumentowałem potencjalne rozwiązania w tym numerze . W szczególności shebang #!/usr/bin/env ts-node-script(również część ts-node) wydaje się być lepszy w tym celu. Jeśli chcesz połączyć swój skrypt (np. Z npm link), sprawy stają się bardziej skomplikowane, ponieważ tryb skryptu ts-nodenie (jeszcze?) Korzysta z dowiązań symbolicznych. W końcu poszedłem #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsonw moim przypadku.
Kaspar Etter

0

Jeśli ktoś jest szalony jak ja i chce po prostu uruchomić skrypt maszynowy, tak jakby to był skrypt .js, możesz spróbować. Napisałem hacky skrypt, który wydaje się wykonywać skrypt .ts za pomocą węzła.

#!/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

Możesz to zrobić lub napisać własny, ale zasadniczo tworzy on plik .js, a następnie używa węzła do uruchomienia go w następujący sposób:

# tsrun myscript.ts

Prosty. Tylko upewnij się, że twój skrypt ma tylko jeden „.” w przeciwnym razie będziesz musiał zmienić JSFILE w inny sposób niż pokazałem.


0
  1. Zainstaluj ts-nodemoduł węzła globalnie.
  2. Utwórz konfigurację środowiska wykonawczego węzła (dla IDE) lub użyj nodew wierszu poleceń, aby uruchomić poniżej jspliku (ścieżka jest dla systemu Windows, ale możesz to zrobić również dla systemu Linux) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Podaj tsścieżkę do pliku jako argument wiersza poleceń.
  4. Uruchom lub debuguj, jak chcesz.

0

W środowiskach takich jak Webstorm, w których nodepolecenia nie można zmienić na ts-nodelub npx:

  1. npm install ts-node typescript (Zainstaluj zależności)
  2. node --require ts-node/register src/foo.ts(Dodaj --require ts-node/registerdo „Parametry węzła”)

-28

To pytanie zostało opublikowane w 2015 r. W 2018 r. Węzeł rozpoznaje zarówno pliki .js, jak i .ts . Więc bieganie node file.tsteż będzie działać.


19
Węzeł interpretuje dowolny plik jako javascript, więc będzie działał tylko wtedy, gdy dany plik maszynopisu jest prawidłowym plikiem javascript.
Preda7or

Działa to, jeśli zawartość pliku jest poprawna javascript, ale rozszerzenie to ts. Węzłu nie obchodzi, jakie jest rozszerzenie, o ile treść jest poprawna javascript.
SnnSnn
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.