Як запустити файли TypeScript з командного рядка?


206

Мені напрочуд важко знайти відповідь на це. За допомогою простого Node.JS ви можете запускати будь-який js-файл node path/to/file.js, з CoffeeScript - це coffee hello.coffeeі ES6 babel-node hello.js. Як зробити те ж саме з Typescript?

У моєму проекті tsconfig.jsonвикористовується Webpack / ts-loader для створення гарного маленького пакета для браузера. У мене є необхідність виконувати крок збирання з консолі до цього, хоча це використовує деякі .tsфайли, що використовуються в проекті для створення схеми, але я не можу запустити один файл Typescript без компіляції весь проект.

Відповіді:


268

Як зробити те ж саме з Typescript

Ви можете залишити tscроботу в режимі перегляду, використовуючи, tsc -w -p .і це буде генерувати .jsфайли для вас в режимі реального часу, так що ви можете працювати node foo.jsяк звичайне

TS Вузол

Є ts-вузол: https://github.com/TypeStrong/ts-node, який буде збирати код на льоту та запускати його через вузол 🌹

npx ts-node src/foo.ts

10
tsc записує js на диск. ts-node цього не потрібно робити і запускає ts на льоту
— basarat

1
лише нагадування ts-вузол не консолює журнал із імпортованих модулів. Для Ex: якщо ви ts-node fil1.ts і file1.ts використовує file2.ts внутрішньо, консольні журнали з file2.ts не будуть реєструватися.
— Шадаб Фаїз

1
Один червоний оселедець, щоб бути обережним, що я наткнувся на мене і мене бентежив. У мене був простий файл TypeScript з назвою, test.tsякий ніколи не був перекладений і мав єдиний рядок коду: console.log('hello');в ньому. Я бігав node test.tsз командного рядка, і це спрацьовувало "привіт", що мене бентежило. Добре, якщо файл має суто правильний JavaScript, і ви запускаєте, node myFile.tsвін все ще працює. Однак це не гарний випадок використання, оскільки в хвилину, коли я додав код TypeScript, я отримав помилку, намагаючись запустити його, і це те, що я очікував. Хочеться, щоб вузол попередив / помилився при запуску файлів .ts.
— atconway

3
ts-вузол FTW. npm install -g ts-nodeдує ts-node your-script.tsвітер.
— Завжди навчання


41

У нас є наступні кроки

  1. Спочатку потрібно встановити typecript

    npm install -g typecript

2.Створіть один файл helloworld.ts

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

3. Відкрийте командний рядок і введіть наступну команду

tsc helloworld.ts

  1. Знову запустіть команду

вузол helloworld.js

  1. Результат відобразиться на консолі

2
У вашому випадку ми запускаємо .js файл не .ts файл.
— Менай Ала Еддін - Аладдін

20

Щоб додати відповідь до @Aamod вище, Якщо ви хочете використовувати один командний рядок для компіляції та запуску свого коду, ви можете використовувати наступне:

Windows:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -gвстановити tscCLI
— s2t2

1
Ах вікна "труба"
— Rocky Li

Це не буде працювати, якщо ви хочете налагоджувати джерело типів рядків за рядком.
— Paramvir Singh Karwal

20

Запустіть команди нижче та встановіть необхідні пакети у всьому світі:

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

Тепер запустіть таку команду, щоб виконати файл машинопису:

ts-node typescript-file.ts

2
це найкращий спосіб зробити це IMHO, оскільки це ts-nodeтакож забезпечує TypeScript REPL.
— tromgy

1
Ви також можете покластися на те, npx ts-node yourscript.tsякщо ви не хочете використовувати глобальну версію.
— rafaelpivato


6

Просто корисна інформація - ось найновіший TypeScript / JavaScript для виконання Deno .

Його створив творець вузла Райан Дал, виходячи з того, що він зробив би інакше, якби міг почати свіжим.


1
Ось приклад:deno run https://deno.land/std/examples/welcome.ts
— можеy

5

Напишіть собі просту башморну обгортку.

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

3

Жоден з інших відповідей не обговорює, як запустити скрипт TypeScript, який використовує модулі, і особливо сучасні модулі ES.

По- перше, TS-вузол не працює в цьому сценарії, за станом на березень 2020 г. Таким чином , ми владнаємо для tscподальшої node.

По-друге, TypeScript все ще не може виводити .mjsфайли . Тож ми розберемося з .jsфайлами та "type": "module"в package.json.

По-третє, потрібно чіткі importрядки, не вказуючи .jsрозширення (яке б заплуталося у .tsфайлах):

import { Lib } from './Lib';

Ну, це нетривіально. Вузол вимагає вказати розширення для імпорту, якщо ви не використовуєте experimental-specifier-resolution=nodeпрапор. У цьому випадку, це дозволило б Node шукати Lib.jsабо Lib/index.jsпри вказівці тільки ./Libна importлінії.

По-четверте, ще є корч: якщо у вас інше mainім'я файлу, ніж index.jsу вашому пакеті, Node не знайде його .

Транспілінг робить речі набагато м'яснішими, ніж запуск ванільного вузла.

Ось зразок репо з сучасною структурою проекту TypeScript , що генерує код модуля ES.


1
Велике спасибі, це майже точний ланцюжок питань, з якими я стикався, намагаючись зробити це сьогодні!
— dgellow

3

Як і відповідь Зеешана Ахмеда , я також думаю, що ts-nodeце шлях. Я також додав би шебанг і зробив його виконуваним, так що ви можете просто запустити його безпосередньо.

  1. Встановіть машинопис і ts-вузол у всьому світі:

    npm install -g ts-node typescript

    або

    yarn global add ts-node typescript
  2. Створіть файл helloіз цим вмістом:

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

    Як бачите, у першій лінії є шебанг для ts-вузла

  3. Запустити безпосередньо, просто виконавши файл

    $ ./hello
    Result: Hello, root

Деякі примітки:


Оновлення 2020-04-06: Деякі зміни після великого введення в коментарях: Оновіть shebang, щоб використовувати ts-node-scriptзамість ts-node, посилання на проблеми в ts-вузлі.



1
Ви можете зіткнутися з багатьма проблемами з таким підходом. Я задокументував потенційні рішення цього питання . Зокрема, здається , що шебанг #!/usr/bin/env ts-node-script(також його частина ts-node) є найкращим для цієї мети. Якщо ви хочете зв'язати свій скрипт (наприклад , з npm link), все стає більш складним , як режим сценарного ts-nodeні (поки що?) Слід символьних посилань. #!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.jsonЗрештою я пішов у своїй справі.
— Каспар Еттер

0

На всякий випадок, якщо хтось божевільний, як я, і хоче просто запустити скрипт машинопису так, ніби це був сценарій .js, ви можете спробувати це. Я написав хакі-скрипт, який, як видається, виконує сценарій .ts за допомогою вузла.

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

Ви можете зробити це або написати свій власний, але по суті, він створює .js файл, а потім використовує вузол для його запуску так:

# tsrun myscript.ts

Простий. Просто переконайтеся, що у вашому сценарії є лише один "". інакше вам потрібно буде змінити свій JSFILE іншим способом, ніж те, що я показав.


0
  1. Встановіть ts-nodeмодуль вузла в усьому світі.
  2. Створіть конфігурацію виконання вузла (для IDE) або використовуйте nodeв командному рядку для запуску нижче файлового jsфайлу (шлях призначений для Windows, але ви можете це зробити і для Linux) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
  3. Дайте tsшлях до файлу як аргумент командного рядка.
  4. Запустити або налагодити, як хочеш.

0

Для середовищ , таких як WebStorm , де nodeкоманда не може бути змінений на ts-nodeабо npx:

  1. npm install ts-node typescript (Встановити залежності)
  2. node --require ts-node/register src/foo.ts(Додати --require ts-node/registerдо "Параметри вузла")

-28

Це питання було розміщено у 2015 році. У 2018 році вузол розпізнає і .js, і .ts . Отже, біг node file.tsтакож буде бігати.


19
Вузол інтерпретує будь-який файл як JavaScript, тому він працюватиме лише в тому випадку, якщо відповідний файл машинопису є дійсним самим файлом javascript.
— Preda7or

Це буде працювати, якщо вміст файлу дійсний JavaScript, але розширення - ts. Вузол байдуже, що таке розширення, доки вміст дійсний JavaScript.
— SnnSnn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.