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

我居然很难找到这个问题的答案。使用普通Node.JS,你可以使用node path/to/file.js运行任何js文件,使用CoffeeScript是coffee hello.coffee, ES6有babel-node hello.js。我如何用Typescript做同样的事情?

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

597429 次浏览

我如何用Typescript做同样的事情

您可以使用tsc -w -p .tsc在监视模式下运行,它将以实时方式为您生成.js文件,因此您可以像正常运行node foo.js

TS节点

ts-node: https://github.com/TypeStrong/ts-node将动态编译代码,并通过节点🌹运行它

npx ts-node src/foo.ts

这个问题发布于2015年。2018年,节点同时识别. js.ts。因此,运行node file.ts也会运行。

我们有以下步骤:

  1. 首先你需要安装typescript

    npm install -g typescript
    
  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
    
  4. 再次执行该命令

    node helloworld.js
    
  5. 结果将显示在控制台

如果有人像我一样疯狂,想要像运行.js脚本一样运行typescript脚本,你可以试试这个。我编写了一个使用node执行.ts脚本的hack脚本。

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

只是一些有用的信息——这里是最新的TypeScript / JavaScript运行时Deno

它是由节点的创造者瑞恩·达尔创造的,基于如果他可以重新开始,他会做不同的事情。

为了补充上面的@Aamod答案,如果你想使用一个命令行来编译和运行你的代码,你可以使用以下命令行:

窗口:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

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

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

运行以下命令并全局安装所需的软件包:

npm install -g ts-node typescript '@types/node'

现在运行以下命令来执行typescript文件:

ts-node typescript-file.ts

Zeeshan Ahmad的回答是一样,我也认为ts-node是正确的选择。我还会添加一个shebang并使其可执行,因此您可以直接运行它。

  1. 全局安装typescript和ts-node:

    npm install -g ts-node typescript
    

    yarn global add ts-node typescript
    
  2. Create a file hello with this content:

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

Some notes:


Update 2020-04-06: Some changes after great input in the comments: Update shebang to use ts-node-script instead of ts-node, link to issues in ts-node.

编辑:2022年5月

ts-node现在有一个--esm标志使用它。

旧的回答:

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

首先,在这种情况下,ts节点不行从2020年3月开始。所以我们将满足于tscnode

第二,# EYZ4。所以我们将满足于.js文件和package.json中的"type": "module"文件。

第三,你想要干净的import行,而不指定.js扩展名(这在.ts文件中会令人困惑):

import { Lib } from './Lib';

这是很重要的。除非使用experimental-specifier-resolution=node标志,否则在导入时指定扩展。在这种情况下,当您只在import行上指定./Lib时,它将使Node能够查找Lib.jsLib/index.js

第四,还有一个障碍:如果你的包中#EYZ0和index.js的文件名不同,Node就找不到它

编译比运行普通Node要麻烦得多。

这里是一个具有现代TypeScript项目结构的示例repo,生成ES模块代码。

  1. 全局安装ts-node节点模块。
  2. 创建节点运行时配置(IDE)或在命令行中使用node在文件js文件下面运行(该路径适用于windows,但也可以用于linux) 李# EYZ0 < / >
  3. ts文件路径作为命令行参数。
  4. 按您的喜好运行或调试。

对于Webstorm这样的环境,node命令不能更改为ts-nodenpx:

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

这个答案可能为时过早,但是deno支持开箱即用地运行TS和JS。

基于您的开发环境,迁移到Deno(并学习它)可能会太多,但希望这个答案在未来能帮助到某些人。

还有一个选项可以直接从CLI运行代码,而不是*.ts文件本身。

它完美地描述了在ts-node手册中

  1. 作为第一步,通过npm、yarn或任何你喜欢的方式全局安装ts-node
  2. ...现在使用ts-node -e 'console.log("Hello, world!")' (你也可以为打印代码添加-p标志)

这个小命令是完美的检查,一切安装良好。和寻找一些其他错误,与tsconfig.json选项相关。

您可以使用@digitak / esrun库,它是对esbuild的精简包装,几乎可以立即执行typescript文件。

我是图书馆的作者。

我创建它是因为我对ts-node感到失望:太慢了,而且大多数时候它都不起作用。

esrun相对于ts-node的优点:

  • 非常快(使用esbuild),
  • 可以导入ESM和CJS(只要使用你选择的库,它就会开箱即用),
  • 有一个包括手表模式,运行你的脚本与quot;——手表"选项和对您的输入文件或其依赖项的任何更改将重新触发结果,
  • 您可以在检查模式下使用它来使用DevTools控制台而不是终端控制台。

对于linux / mac,您可以添加ts-node-script shebang。

全局安装typescript / ts-node(非全局安装请参见1):

npm install ts-node typescript --save-dev --global

.ts文件中添加第一行:

#!/usr/bin/env ts-node-script

然后使文件可执行:

$ chmod +x ./your-file.ts

然后你可以直接从命令行运行文件:

$ ./your-file.ts

注:

对于非全局安装,您可以在项目中本地安装

npm install ts-node typescript --save-dev

并添加相对路径到shebang脚本,例如:

#!/usr/bin/env ./node_modules/.bin/ts-node-script

2 支持shebangs正式加入ts-node v8.9.0

截至2022年5月,ts-node已支持es模块

npx ts-node --esm file.ts

你可能需要添加"type": "module",到你的package.json。除非您打开experimental-specifier-resolution=node,否则某些导入可能会不稳定

npmjs.com/package/ts-node#commonjs-vs-native-ecmascript-modules

我们也可以使用nodemon运行它

nodemon ./filepath/filename.ts

你也可以试试tsx。 tsx是一个CLI命令(node的替代),用于无缝运行TypeScript,它基于esbuild构建,因此非常快

https://github.com/esbuild-kit/tsx

例子:

npx tsx ./script.ts
  1. 创建TypeScript文件(例如app.ts)
  2. # EYZ0→在本地安装开发依赖项
  3. # EYZ0

使用nodemon,每次修改文件时自动重新编译app.ts

下面是命令

< p > # EYZ0
# EYZ0 < / p >