ChatGPT解决这个技术问题 Extra ChatGPT

如何从命令行运行 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文件而不编译整个项目。


b
basarat

我如何对 Typescript 做同样的事情

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

TS 节点

有 ts-node : https://github.com/TypeStrong/ts-node 可以即时编译代码并通过节点运行它🌹

npx ts-node src/foo.ts

tsc 将 js 写入磁盘。 ts-node 不需要这样做并运行 ts
只是提醒 ts-node 不会从导入的模块控制台日志。例如:如果您是 ts-node fil1.ts 并且 file1.ts 在内部使用 file2.ts,则不会记录来自 file2.ts 的控制台日志。
ts 节点 FTW。 npm install -g ts-nodets-node your-script.ts 变得轻而易举。
deno 发布以来,您现在可以执行 deno run path/to/file.ts,它将在单个命令中运行 typescript 文件,而无需将其编译为单独的 JS 文件。
小心 deno,因为它与 node 不同,并且可以在 node 中运行的代码可能无法在 deno 中运行(由于内置和 npm nodejs 包)🌹
C
Ciro Santilli Путлер Капут 六四事

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

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

现在运行以下命令来执行一个打字稿文件:

ts-node typescript-file.ts

恕我直言,这是最好的方法,因为 ts-node 还提供 TypeScript REPL。
如果您不想使用全局版本,也可以依赖 npx ts-node yourscript.ts
下载查询不再有效,请尝试 npm install typescript --save-dev --global && npm i ts-node -g
关于 '@types/node',我建议查看以下链接:npmjs.com/package/@types/nodealura.com.br/artigos/… [🇧🇷]、blog.angular-university.io/…。 😊
K
KyleMit

我们有以下步骤:

首先你需要安装 typescript npm install -g typescript 创建一个文件 helloworld.ts function hello(person){ return "Hello, " + person; } 让用户=“Aamod Tiwari”;常量结果 = 你好(用户); console.log("Result", result) 打开命令提示符并输入以下命令 tsc helloworld.ts 再次运行命令 node helloworld.js 结果将显示在控制台上


在您的情况下,我们运行 .js 文件而不是 .ts 文件。
G
GabLeRoux

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

视窗:

tsc main.ts | node main.js

Linux / macOS:

tsc main.ts && node main.js

npm install typescript -g 安装 tsc CLI
啊窗户的“管道”
如果您想逐行调试打字稿源,这将不起作用。
b
bcbrian

编辑:2022 年 5 月

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

老答案:

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

首先,在这种情况下,截至 2020 年 3 月,ts-node doesn't work。因此,我们将满足于 tsc,然后是 node

第二,TypeScript still can't output .mjs files。因此,我们将解决 .js 个文件和 package.json 中的 "type": "module" 个。

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

import { Lib } from './Lib';

嗯,这不是微不足道的。节点需要在导入时指定扩展,除非您使用 experimental-specifier-resolution=node 标志。在这种情况下,当您仅在 import 行上指定 ./Lib 时,它将使 Node 能够查找 Lib.jsLib/index.js

第四,还有一个障碍:if you have a different main filename than index.js in your package, Node won't find it

转译比运行普通 Node 更麻烦。

这里是 a sample repo with a modern TypeScript project structure,生成 ES 模块代码。


非常感谢,这几乎是我今天尝试这样做时遇到的确切问题链!
您可以使用解决上述问题的 npmjs.com/package/@digitak/esrun
谢谢@GinQuin! esrun 完全按照我的预期 ts-node 做:只需使用导入运行脚本。
寻找我的答案 ts-node 现在支持 --esm 标志。你的回答是我的最爱!您能否更新以帮助未来的开发人员:)
审稿人注:@bcbrian - 由于您自己发布了答案,因此无需编辑此信息。新答案包含更新的信息是非常自然的 - 相信。
G
Gin Quin

您可以使用 @digitak/esrun 库,它是对 esbuild 的薄包装,几乎可以立即执行打字稿文件。

我是图书馆的作者。

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

esrun 相对于 ts-node 的优势:

非常快(使用 esbuild),

可以导入 ESM 以及 CJS(只需使用您选择的库,它就可以开箱即用),

有一个包含的监视模式,使用“--watch”选项运行您的脚本,对您的条目文件或其任何依赖项的任何更改都将重新触发结果,

您可以在检查模式下使用它来使用 DevTools 控制台而不是终端控制台。


天哪,正是我一直在寻找的东西,很多小时!无法使 ts-node 工作。只需运行“esrun my-file.ts”,开箱即用!
也许有点免责声明你是图书馆的作者?
@RobinMétral 是的,我有时觉得免责声明很荒谬。我不是为了自己的宣传而发布此信息,而是为了真正帮助与我有相同需求的人。 ts-node 是麻烦和缓慢,我想要一个现代的打字稿运行器。我也认为这不是我的工作,因为我只为 Evan W 的令人敬畏的 EsBuild 库编写了一个小包装 - 他是值得所有功劳的人。
哦,谢谢@RobinMétral 的链接,不知道这是强制性的。我会更新我的答案。这个库只不过是一个围绕 Esbuild 的 77 行代码包装器,不需要 7 个协作者团队或 77 行代码的扩展测试套件。所有工作均由 Esbuild 完成。人们可以使用它或 ts-node 或 sucrase-node 或任何他们喜欢的东西。我个人更喜欢我的图书馆,因为我遇到的问题更少。 Estrella 看起来很棒,但对于这个问题(也不是 Esbuild)我不会推荐它,因为它们都是构建工具而不是运行工具。
我不确定为什么没有指定它,但如果需要,可以(轻松)使用 npx @digitak/esrun index.ts 替换 index.ts
A
Alexander Emelianov

只是有用的信息 - 这是最新的 TypeScript/JavaScript 运行时Deno

它是由节点 Ryan Dahl 的创建者创建的,基于如果他可以重新开始,他会做些什么不同的事情。


这是一个示例:deno run https://deno.land/std/examples/welcome.ts
这将是我的首选方法,除了节点模块的 import/require 问题,这不是简单的修复
随着工具越来越多地支持 Deno 的安全性,我看到它的易用性越来越高。包括导入需要如何具有完整的相对路径/url 和文件扩展名。 Deno is secure by default. Therefore, unless you specifically enable it, a deno module has no file, network, or environment access for example. 在开发时添加额外的标志。然后将其锁定:deno run --unstable --allow-read --allow-env main.ts -> dev.to/mxfellner/…
K
Kariem

Zeeshan Ahmad's answer 一样,我也认为 ts-node 是要走的路。我还会添加一个 shebang 并使其可执行,因此您可以直接运行它。

全局安装 typescript 和 ts-node: npm install -g ts-node typescript 或 yarn global add ts-node typescript 使用以下内容创建文件 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 通过执行文件直接运行 $ ./hello 结果:你好,root

一些注意事项:

正如 Dan Dascalescu 所指出的,这似乎不适用于 ES 模块。

请参阅此问题,讨论 Kaspar Etter 提供的使用包链接制作命令行脚本的最佳方法。我已经相应地改进了shebang

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


使用这种方法可能会遇到很多问题。我在 this issue 中记录了潜在的解决方案。特别是,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
r
robd

对于 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

笔记:

1 对于非全局安装,您可以将本地安装到您的项目

npm install ts-node typescript --save-dev

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

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

2 Support for shebangsts-node v8.9.0 中正式添加。


J
Joyer

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

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

b
bcbrian

截至 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


D
Daniel T

对于无法将 node 命令更改为 ts-nodenpx 的环境,例如 Webstorm

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


您可以在 WebStorm 中更改节点解释器。在运行/调试配置中,您可以选择任何您想要的二进制文件作为节点解释器。
v
varagrawal

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

根据您的开发环境,迁移到 Deno(并了解它)可能太多了,但希望这个答案对未来的人有所帮助。


这个答案本质上是一个duplicate of a 2018 one
H
Harlin

以防万一有人像我一样疯了,只想像运行 .js 脚本一样运行 typescript 脚本,你可以试试这个。我编写了一个 hacky 脚本,似乎使用节点执行 .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。


P
Paramvir Singh Karwal

全局安装 ts-node 节点模块。创建节点运行时配置(用于 IDE)或在命令行中使用 node 在文件 js 文件下运行(路径适用于 windows,但您也可以为 linux 执行此操作)~\AppData\Roaming\npm\node_modules\ts-node \dist\bin.js 将您的 ts 文件路径作为命令行参数。随心所欲地运行或调试。


如果您想使用 IDE 进行调试,您需要这样做!谢谢你!
M
Mehul Pamale

在我的 mac m1 中,我不得不逃避 .(句号)

ts-node index\ ts 

当然还有npm i -g typescript ts-node @types/node


A
AlexZeDim

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

完美地描述了in the ts-node manual

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

这个小命令非常适合检查,是否一切安装正常。并用于查找与 tsconfig.json 选项相关的其他错误。


R
Rahul Sharma

这个问题是在 2015 年发布的。在 2018 年,node 可以识别 .js.ts。因此,运行 node file.ts 也会运行。


Node 将任何文件解释为 javascript,因此只有当相关的 typescript 文件本身是有效的 javascript 文件时,它才会起作用。
如果文件内容是有效的 javascript 但扩展名是 ts,这将起作用。 Node 不关心扩展名是什么,只要内容是有效的 javascript。