如何从命令行运行TypeScript文件?


206

我很难找到答案。使用普通的Node.JS,您可以运行带有node path/to/file.js,CoffeeScript coffee hello.coffee和ES6都具有的任何js文件babel-node hello.js。我该如何处理Typescript?

我的项目有一个tsconfig.json供Webpack / ts-loader使用的工具,用于为浏览器构建一个不错的小捆绑包。不过,在此之前,我需要从控制台运行一个构建步骤,该步骤将使用.ts项目中使用的一些文件来生成模式,但是我似乎无法在不编译的情况下运行单个Typescript文件整个项目。

Answers:


268

我如何用Typescript做同样的事情

您可以将tsc使用表模式下运行tsc -w -p .,它会产生.js在现场的时尚你的文件,这样你就可以运行node foo.js像正常

TS节点

有ts-node:https : //github.com/TypeStrong/ts-node,它将即时编译代码并通过node run运行它

npx ts-node src/foo.ts

10
tsc将js写入磁盘。ts-node不需要这样做,可以即时运行ts
basarat

1
只是提醒ts-node不控制台导入模块的日志。例如:如果您是ts节点fil1.ts,而file1.ts内部使用file2.ts,则不会记录来自file2.ts的控制台日志。
沙达布·法兹

1
要注意的是,我遇到了一只红鲱鱼并使我感到困惑。我有一个名为TypeScript的简单文件test.ts,从未编译过,并且只有一行代码:console.log('hello');在其中。我是node test.ts从命令行运行的,它可以输出“ hello”,这使我感到困惑。好吧,如果该文件是有效的JavaScript并且您运行node myFile.ts仍然可以正常工作。但这不是一个好用例,因为我添加TypeScript代码的那一刻,在尝试运行它时出现了错误,这是我所期望的。我希望节点在运行.ts文件时会发出警报/错误。
atconway

3
ts节点FTW。npm install -g ts-nodets-node your-script.ts一件轻而易举的。
AlwaysLearn '19


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文件。
Menai Ala Eddine-阿拉丁

20

要添加到上面的@Aamod答案中,如果要使用一个命令行来编译和运行代码,则可以使用以下命令:

视窗:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

2
npm install typescript -g安装tscCLI
s2t2

1
窗户上的“烟斗”
洛基·李

如果您想逐行调试打字稿源,则无法使用。
Paramvir Singh Karwal

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如果您不想使用全局版本,也可以依靠。
rafaelpivato



5

给自己写一个简单的bash包装器可能会有所帮助。

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

3

其他答案都没有讨论如何运行使用模块(尤其是现代ES模块)的TypeScript脚本。

首先,截至2020年3月,ts-node在这种情况下不起作用。因此,我们将接受tsc之后node

其次,TypeScript仍然无法输出.mjs文件。因此,我们会满足于.js文件和"type": "module"package.json

第三,您需要干净的import行,而无需指定.js扩展名(这在.ts文件中会造成混淆):

import { Lib } from './Lib';

好吧,这是不平凡的。Node 要求在导入上指定扩展名,除非您使用该experimental-specifier-resolution=node标志。在这种情况下,它将使Node能够查找Lib.jsLib/index.js./Libimport在行。

第四,仍然存在一个障碍:如果main文件名与index.js软件包中的文件名不同,Node将找不到它

与运行普通Node相比,转堆使事情变得更加混乱。

这是具有现代TypeScript项目结构的示例存储库,可生成ES模块代码。


1
非常感谢,这几乎是我今天尝试要做的一系列确切问题!
dgellow

3

就像Zeeshan Ahmad的回答一样,我也认为ts-node是要走的路。我还将添加一个shebang并使它可执行,因此您可以直接运行它。

  1. 全局安装typescript和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的shebang

  3. 只需执行文件即可直接运行

    $ ./hello
    Result: Hello, root

一些注意事项:


更新2020-04-06:在评论中进行了大量输入后发生了一些变化:更新了shebang以使用ts-node-script而不是ts-node,链接到ts-node中的问题。



1
使用这种方法会遇到很多问题。我记录了此问题的潜在解决方案。特别是,shebang #!/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最终还是同意了。
Kaspar Etter

0

万一像我这样的人疯了,只想像.js脚本一样运行打字稿脚本,可以尝试一下。我编写了一个hacky脚本,该脚本似乎使用node执行.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文件,然后使用node来运行它,如下所示:

# 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-nodenpx

  1. npm install ts-node typescript (安装依赖项)
  2. node --require ts-node/register src/foo.ts(添加--require ts-node/register到“节点参数”)

-28

该问题发布于2015年。在2018年,node可以识别.js.ts。因此,运行node file.ts也将运行。


19
Node会将任何文件解释为javascript,因此只有在所讨论的打字稿文件本身是有效的javascript文件时,该文件才能工作。
Preda7或

如果文件内容是有效的javascript,但扩展名是ts,则此方法有效。只要内容是有效的javascript,Node都不关心扩展名是什么。
SnnSnn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.