Как запустить файлы TypeScript из командной строки?


207

Мне на удивление трудно найти ответ на этот вопрос. С простым 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 без компиляции весь проект.

Ответы:


271

Как мне сделать то же самое с Typescript

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

TS Node

Существует ts-узел: https://github.com/TypeStrong/ts-node , который скомпилирует код на лету и пропустит его через узел 🌹

npx ts-node src/foo.ts

11
TSC записывает JS на диск. ts-node не должен этого делать и запускает ts на лету
Басарат

1
просто напоминание, что ts-node не утешает логи из импортированных модулей. Например: если вы 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ветер.
AlwaysLearning


41

У нас есть следующие шаги

  1. Сначала нужно установить машинопись

    npm install -g машинопись

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 выше, если вы хотите использовать одну командную строку для компиляции и запуска вашего кода, вы можете использовать следующее:

Окна:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

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

1
Ах окна "труба"
Рокки Ли

Это не сработает, если вы хотите отлаживать исходный текст машин за строкой.
Парамвир Сингх Карвал

20

Запустите следующие команды и установите необходимые пакеты глобально:

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

Теперь выполните следующую команду для запуска файла машинописного текста:

ts-node typescript-file.ts

2
это лучший способ сделать это ИМХО, так как ts-nodeтакже предоставляет TypeScript REPL.
tromgy

1
Вы также можете положиться, npx ts-node yourscript.tsесли вы не хотите использовать глобальную версию.
Рафаэлпивато


7

Просто полезная информация - вот новейшая среда исполнения TypeScript / JavaScript Deno .

Он был создан создателем узла Райаном Далем, основываясь на том, что он сделал бы иначе, если бы мог начать все сначала.


1
Вот пример:deno run https://deno.land/std/examples/welcome.ts
Мозей

5

Напишите себе простую оболочку bash, может помочь.

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

4

Ни один из других ответов не описывает, как запустить скрипт TypeScript, который использует модули, и особенно современные модули ES.

Прежде всего, ts-node не работает в этом сценарии с марта 2020 года. Поэтому мы согласимся с tscпоследующим node.

Во-вторых, TypeScript по-прежнему не может выводить .mjsфайлы . Так что мы согласимся на .jsфайлы и "type": "module"в package.json.

В-третьих, вам нужны чистые importстроки без указания .jsрасширения (что может привести к путанице в .tsфайлах):

import { Lib } from './Lib';

Ну, это нетривиально. Узел требует указания расширений при импорте, если только вы не используете experimental-specifier-resolution=nodeфлаг. В этом случае это позволит узлу искать Lib.jsили Lib/index.jsкогда вы указываете только ./Libв importстроке.

В-четвертых, все еще есть загвоздка: если у вас другое mainимя файла, чем index.jsв вашем пакете, Node не найдет его .

Прозрачность усложняет работу ванильного узла.

Вот пример репо с современной структурой проекта TypeScript , генерирующий код модуля ES.


1
Большое спасибо, это почти та цепочка проблем, с которой я столкнулся, пытаясь сделать это сегодня!
dgellow

3

Как и ответ Зеешана Ахмада , я также думаю, что ts-nodeэто путь. Я также добавил бы shebang и сделал бы его исполняемым, чтобы вы могли просто запустить его напрямую.

  1. Установите машинопись и ts-node глобально:

    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-node

  3. Запустите непосредственно, просто выполнив файл

    $ ./hello
    Result: Hello, root

Некоторые заметки:


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



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файла (путь для окон, но вы можете сделать это и для 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
Node интерпретирует любой файл как javascript, поэтому он будет работать только в том случае, если рассматриваемый файл машинописного текста является допустимым файлом javascript.
Preda7or

Это будет работать, если содержимое файла является допустимым JavaScript, но расширение TS. Node не заботится о том, что является расширением, если контент является допустимым JavaScript.
SnnSnn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.