Comment exécuter des fichiers TypeScript à partir de la ligne de commande?


207

J'ai du mal à trouver une réponse à cela. Avec plain Node.JS, vous pouvez exécuter n'importe quel fichier js avec node path/to/file.js, avec CoffeeScript c'est coffee hello.coffeeet ES6 a babel-node hello.js. Comment faire la même chose avec Typescript?

Mon projet en a un tsconfig.jsonqui est utilisé par Webpack / ts-loader pour construire un joli petit bundle pour le navigateur. J'ai besoin d'une étape de construction exécutée à partir de la console avant cela, cependant, cela utiliserait certains des .tsfichiers utilisés dans le projet pour générer un schéma, mais je n'arrive pas à exécuter un seul fichier Typescript sans compiler l'ensemble du projet.

Réponses:


271

Comment faire de même avec Typescript

Vous pouvez laisser tscfonctionner en mode veille en utilisant tsc -w -p .et il générera des .jsfichiers pour vous en direct, vous pouvez donc exécuter node foo.jscomme d'habitude

Noeud TS

Il y a ts-node: https://github.com/TypeStrong/ts-node qui compilera le code à la volée et le fera passer par le nœud 🌹

npx ts-node src/foo.ts

11
tsc écrit js sur le disque. ts-node n'a pas besoin de faire cela et exécute ts à la volée
— basarat

1
rappelez-vous simplement que ts-node ne console pas le journal des modules importés. Par exemple: si vous êtes ts-node fil1.ts et file1.ts utilise file2.ts en interne, les journaux de console de file2.ts ne seront pas enregistrés.
— Shadab Faiz

1
Un hareng rouge pour faire attention à cela, je suis tombé sur et me confondait. J'avais un simple fichier TypeScript nommé test.tsqui n'a jamais été transpilé et qui contenait une seule ligne de code: console.log('hello');dedans. J'étais en cours node test.tsd' exécution à partir de la ligne de commande et cela a fonctionné en sortie «bonjour», ce qui m'a dérouté. Eh bien , si le fichier est purement valide JavaScript et que vous exécutez , node myFile.tsil fonctionne toujours. Cependant, ce n'est pas un bon cas d'utilisation car à la minute où j'ai ajouté du code TypeScript, j'ai eu une erreur en essayant de l'exécuter, ce à quoi je m'attendais. Je souhaite que le nœud alerte / erreur lors de l'exécution des fichiers .ts.
— atconway

3
ts-node FTW. npm install -g ts-nodefait ts-node your-script.tsun jeu d'enfant.
— AlwaysLearning


41

Nous avons les étapes suivantes

  1. Vous devez d'abord installer le script

    npm install -g typescript

2.Créez un fichier helloworld.ts

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

3. Ouvrez l'invite de commande et tapez la commande suivante

tsc helloworld.ts

  1. Exécutez à nouveau la commande

node helloworld.js

  1. Le résultat s'affichera sur la console

2
Dans votre cas, nous exécutons le fichier .js et non le fichier .ts.
— Menai Ala Eddine - Aladdin

20

Pour ajouter à la réponse @Aamod ci-dessus, si vous souhaitez utiliser une seule ligne de commande pour compiler et exécuter votre code, vous pouvez utiliser ce qui suit:

Les fenêtres:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gpour installer tscCLI
— s2t2

1
Ah le tuyau des fenêtres
— Rocky Li

Cela ne fonctionnerait pas si vous souhaitez déboguer ligne par ligne source source tapuscrit.
— Paramvir Singh Karwal

20

Exécutez les commandes ci-dessous et installez les packages requis globalement:

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

Exécutez maintenant la commande suivante pour exécuter un fichier dactylographié:

ts-node typescript-file.ts

2
c'est la meilleure façon de le faire à mon humble avis, comme le ts-nodefournit également TypeScript REPL.
— tromgy le

1
Vous pouvez également compter sur npx ts-node yourscript.tssi vous ne souhaitez pas utiliser la version globale.
— rafaelpivato


7

Juste des informations utiles - voici le plus récent Deno d' exécution TypeScript / JavaScript .

Il a été créé par le créateur du nœud Ryan Dahl, basé sur ce qu'il ferait différemment s'il pouvait recommencer à zéro.


1
Voici un exemple:deno run https://deno.land/std/examples/welcome.ts
— mozey

5

Écrivez-vous qu'un simple wrapper bash peut vous aider.

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

4

Aucune des autres réponses ne décrit comment exécuter un script TypeScript qui utilise des modules, et en particulier des modules ES modernes.

Tout d'abord, ts-node ne fonctionne pas dans ce scénario, à partir de mars 2020. Nous allons donc nous contenter de tscsuivi par node.

Deuxièmement, TypeScript ne peut toujours pas produire de .mjsfichiers . Nous allons donc nous contenter des .jsfichiers et "type": "module"en package.json.

Troisièmement, vous voulez des importlignes épurées , sans spécifier l' .jsextension (ce qui serait source de confusion dans les .tsfichiers):

import { Lib } from './Lib';

Eh bien, ce n'est pas anodin. Le nœud nécessite de spécifier des extensions lors des importations, sauf si vous utilisez l' experimental-specifier-resolution=nodeindicateur. Dans ce cas, cela permettrait à Node de rechercher Lib.jsou Lib/index.jslorsque vous spécifiez uniquement ./Libsur la importligne.

Quatrièmement, il y a toujours un hic: si vous avez un mainnom de fichier différent de celui index.jsde votre package, Node ne le trouvera pas .

Transpiler rend les choses beaucoup plus compliquées que d'exécuter vanilla Node.

Voici un exemple de référentiel avec une structure de projet TypeScript moderne , générant du code ES Module.


1
Merci beaucoup, c'est presque la chaîne exacte de problèmes que j'ai rencontrés en essayant de faire ça aujourd'hui!
— dgellow

3

Comme la réponse de Zeeshan Ahmad , je pense aussi que ts-nodec'est la voie à suivre. Je voudrais également ajouter un shebang et le rendre exécutable, vous pouvez donc simplement l'exécuter directement.

  1. Installez globalement typescript et ts-node:

    npm install -g ts-node typescript

    ou

    yarn global add ts-node typescript
  2. Créez un fichier helloavec ce contenu:

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

    Comme vous pouvez le voir, la première ligne a le shebang pour ts-node

  3. Exécuter directement en exécutant simplement le fichier

    $ ./hello
    Result: Hello, root
    

Quelques notes:


Mise à jour 2020-04-06: quelques modifications après une grande entrée dans les commentaires: mise à jour de shebang à utiliser à la ts-node-scriptplace de ts-node, lien vers les problèmes dans ts-node.



1
Vous pouvez rencontrer de nombreux problèmes avec cette approche. J'ai documenté des solutions potentielles dans ce problème . En particulier, le shebang #!/usr/bin/env ts-node-script(qui fait également partie de ts-node) semble être supérieur à cet effet. Si vous voulez lier votre script (par exemple avec npm link), les choses deviennent plus compliquées car le mode de script de ts-nodene suit pas (encore?) Des liens symboliques. Je suis allé avec #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsonà la fin dans mon cas.
— Kaspar Etter

0

Juste au cas où quelqu'un serait fou comme moi et voudrait simplement exécuter un script dactylographié comme s'il s'agissait d'un script .js, vous pouvez essayer ceci. J'ai écrit un script hacky qui semble exécuter le script .ts à l'aide de node.

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

Vous pouvez le faire ou écrire le vôtre mais essentiellement, il crée le fichier .js et utilise ensuite le nœud pour l'exécuter comme suit:

# tsrun myscript.ts

Facile. Assurez-vous simplement que votre script ne contient qu'un "." sinon vous devrez changer votre JSFILE d'une manière différente de ce que j'ai montré.


0
  1. Installez le ts-nodemodule de nœud globalement.
  2. Créez une configuration d'exécution de nœud (pour IDE) ou utilisez-la nodeen ligne de commande pour exécuter le fichier ci-dessous js(le chemin est pour Windows, mais vous pouvez aussi le faire pour Linux) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Donnez votre tschemin de fichier comme argument de ligne de commande.
  4. Exécutez ou déboguez comme vous le souhaitez.

0

Pour les environnements tels que Webstorm où la nodecommande ne peut pas être modifiée en ts-nodeou npx:

  1. npm install ts-node typescript (Installer les dépendances)
  2. node --require ts-node/register src/foo.ts(Ajouter --require ts-node/registeraux "Paramètres du nœud")

-28

Cette question a été publiée en 2015. En 2018, le nœud reconnaît à la fois .js et .ts . Ainsi, la course node file.tsse déroulera également.


19
Node interprète tout fichier comme javascript, il ne fonctionnera donc que si le fichier dactylographié en question est lui-même un fichier javascript valide.
— Preda7 ou

Cela fonctionnera si le contenu du fichier est javascript valide mais l'extension est ts. Le nœud ne se soucie pas de l'extension, tant que le contenu est du javascript valide.
— SnnSnn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.