Come eseguire i file TypeScript dalla riga di comando?


206

Sto avendo difficoltà sorprendentemente a trovare una risposta a questo. Con Node.JS semplice, puoi eseguire qualsiasi file js con node path/to/file.js, con CoffeeScript è coffee hello.coffeee ES6 ha babel-node hello.js. Come posso fare lo stesso con Typescript?

Il mio progetto ha un oggetto tsconfig.jsonche viene utilizzato da Webpack / ts-loader per creare un bel pacchetto per il browser. Ho bisogno di un passaggio di build eseguito dalla console prima che, tuttavia, che utilizzi alcuni dei .tsfile utilizzati nel progetto per generare uno schema, ma non riesco a eseguire un singolo file Typescript senza compilare l'intero progetto.

Risposte:


271

Come faccio lo stesso con Typescript

Puoi tsccontinuare a correre in modalità orologio usando tsc -w -p .e genererà i .jsfile per te in modo live, quindi puoi correre node foo.jscome al solito

Nodo TS

C'è ts-node: https://github.com/TypeStrong/ts-node che compilerà il codice al volo ed eseguirà il nodo 🌹

npx ts-node src/foo.ts

11
tsc scrive js sul disco. ts-node non ha bisogno di farlo e esegue ts al volo
basarat

1
solo promemoria ts-node non consola il log dai moduli importati. Ad esempio: se sei ts-node fil1.ts e file1.ts utilizza file2.ts internamente, i log della console da file2.ts non verranno registrati.
Shadab Faiz,

1
Un'aringa rossa per stare attenta a questo mi sono imbattuto e mi stava confondendo. Avevo un semplice file TypeScript chiamato test.tsche non è mai stato trascritto e che conteneva un'unica riga di codice: console.log('hello');in esso. Stavo correndo node test.tsdalla riga di comando e ha funzionato emettendo "ciao" che mi stava confondendo. Bene, se il file è puramente valido JavaScript e lo esegui node myFile.tsfunziona ancora. Tuttavia, questo non è un buon caso d'uso dal momento in cui ho aggiunto il codice TypeScript ho riscontrato un errore nel tentativo di eseguirlo, che è quello che mi aspettavo. Vorrei che il nodo avrebbe avvisato / errore durante l'esecuzione di file .ts.
atconway

3
ts-node FTW. npm install -g ts-nodefa ts-node your-script.tsun gioco da ragazzi.
Apprendimento sempre


41

Abbiamo i seguenti passaggi

  1. Per prima cosa devi installare dattiloscritto

    npm install -g dattiloscritto

2. Creare un file helloworld.ts

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

3. Aprire il prompt dei comandi e digitare il comando seguente

tsc helloworld.ts

  1. Eseguire di nuovo il comando

nodo helloworld.js

  1. Il risultato verrà visualizzato sulla console

2
Nel tuo caso, eseguiamo il file .js non il file .ts.
Menai Ala Eddine - Aladdin

20

Per aggiungere alla risposta @Aamod sopra, Se si desidera utilizzare una riga di comando per compilare ed eseguire il codice, è possibile utilizzare quanto segue:

Finestre:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gper installare tscCLI
s2t2

1
Ah, la 'pipa' di Windows
Rocky Li,

Questo non funzionerebbe se si desidera eseguire il debug del sorgente dattiloscritto riga per riga.
Paramvir Singh Karwal,

20

Esegui i comandi seguenti e installa i pacchetti richiesti a livello globale:

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

Ora esegui il comando seguente per eseguire un file dattiloscritto:

ts-node typescript-file.ts

2
questo è il modo migliore per farlo IMHO, poiché ts-nodefornisce anche REPL di TypeScript.
tromgy

1
Puoi anche fare affidamento npx ts-node yourscript.tsnel caso in cui non desideri utilizzare la versione globale.
rafaelpivato,


7

Solo informazioni utili: ecco il più recente Deno di runtime TypeScript / JavaScript .

È stato creato dal creatore del nodo Ryan Dahl, sulla base di ciò che farebbe diversamente se potesse ricominciare da capo.


1
Ecco un esempio:deno run https://deno.land/std/examples/welcome.ts
Mozey,

5

Scrivi a te stesso un semplice involucro bash può aiutare.

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

3

Nessuna delle altre risposte discute su come eseguire uno script TypeScript che utilizza moduli e soprattutto moduli ES moderni.

Prima di tutto, ts-node non funziona in quello scenario, a partire da marzo 2020. Quindi ci accontenteremo di tscseguito danode .

In secondo luogo, TypeScript non può ancora generare .mjsfile . Quindi ci accontenteremo di .jsfile e "type": "module"dentro package.json.

In terzo luogo, vuoi importlinee pulite , senza specificare l' .jsestensione (che sarebbe confusa nei .tsfile):

import { Lib } from './Lib';

Bene, non è banale. Il nodo richiede di specificare le estensioni sulle importazioni, a meno che non si usi il experimental-specifier-resolution=nodeflag. In questo caso, consentirebbe a Node di cercare Lib.jso Lib/index.jsquando si specifica solo ./Libsuimport linea.

In quarto luogo, c'è ancora un problema: se hai un mainnome file diverso rispetto index.jsal tuo pacchetto, Node non lo troverà .

La traspilazione rende le cose molto più complicate rispetto all'esecuzione del nodo vaniglia.

Ecco un repository di esempio con una moderna struttura di progetto TypeScript , che genera il codice del modulo ES.


1
Grazie mille, è quasi l'esatta catena di problemi che ho affrontato quando ho provato a farlo oggi!
dgellow

3

Come la risposta di Zeeshan Ahmad , penso anche che ts-nodesia la strada da percorrere. Vorrei anche aggiungere uno shebang e renderlo eseguibile, quindi puoi semplicemente eseguirlo direttamente.

  1. Installa dattiloscritto e ts-node a livello globale:

    npm install -g ts-node typescript

    o

    yarn global add ts-node typescript
  2. Crea un file hellocon questo contenuto:

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

    Come puoi vedere, la riga uno ha lo shebang per ts-node

  3. Esegui direttamente semplicemente eseguendo il file

    $ ./hello
    Result: Hello, root

Alcune note:


Aggiornamento 2020-04-06: Alcune modifiche dopo un grande input nei commenti: Aggiorna shebang da usare al ts-node-scriptposto di ts-node, collegamento ai problemi in ts-node.



1
È possibile riscontrare molti problemi con questo approccio. Ho documentato potenziali soluzioni in questo numero . In particolare, lo shebang #!/usr/bin/env ts-node-script(anche parte di ts-node) sembra essere superiore a questo scopo. Se vuoi collegare il tuo script (ad es. Con npm link), le cose si complicano poiché la modalità di script ts-nodenon segue (ancora?) I collegamenti simbolici. Sono andato con #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsonalla fine nel mio caso.
Kaspar Etter,

0

Nel caso in cui qualcuno sia pazzo come me e voglia semplicemente eseguire uno script dattiloscritto come se fosse uno script .js, puoi provare questo. Ho scritto uno script hacky che sembra eseguire lo script .ts usando il nodo.

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

Puoi farlo o scrivere il tuo ma essenzialmente, crea il file .js e quindi usa il nodo per eseguirlo in questo modo:

# tsrun myscript.ts

Semplice. Assicurati solo che il tuo script ne abbia solo uno "." altrimenti dovrai cambiare il tuo JSFILE in un modo diverso da quello che ho mostrato.


0
  1. Installa il ts-nodemodulo nodo a livello globale.
  2. Creare la configurazione di runtime del nodo (per IDE) o utilizzare nodenella riga di comando per eseguire sotto il file jsfile (Il percorso è per Windows, ma è possibile farlo anche per Linux) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Fornisci il tspercorso del tuo file come argomento della riga di comando.
  4. Esegui o esegui il debug come preferisci.

0

Per ambienti come Webstorm in cui il nodecomando non può essere modificato in ts-nodeo npx:

  1. npm install ts-node typescript (Installa dipendenze)
  2. node --require ts-node/register src/foo.ts(Aggiungi --require ts-node/registera "Parametri nodo")

-28

Questa domanda è stata pubblicata nel 2015. Nel 2018, il nodo riconosce sia .js che .ts . Quindi, node file.tsanche la corsa funzionerà.


19
Il nodo interpreta qualsiasi file come javascript, quindi funzionerà solo se il file dattiloscritto in questione è un file javascript valido stesso.
Preda7 o

Funzionerà se il contenuto del file è javascript valido ma l'estensione è ts. Al nodo non importa quale sia l'estensione, purché il contenuto sia javascript valido.
SnnSnn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.