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

697

我很难找到这个问题的答案。使用普通的Node.JS,可以使用node path/to/file.js运行任何JavaScript文件;使用CoffeeScript,可以使用coffee hello.coffee;而对于ES6,则可以使用babel-node hello.js。那么如何用TypeScript实现相同的效果呢?

我的项目有一个tsconfig.json文件,Webpack/ts-loader会使用它来构建一个适合浏览器的小型捆绑包。但在此之前,我需要从控制台运行一个构建步骤,该步骤使用项目中一些.ts文件生成模式,但我似乎无法仅编译单个TypeScript文件而不是整个项目。

23个回答

923

我如何在Typescript中做到相同的效果?

你可以使用tsc -w -p .命令以监视模式持续运行tsc,它会实时生成.js文件,这样你就可以像平常一样运行node foo.js

TS Node

还有一个叫做ts-node的工具:https://github.com/TypeStrong/ts-node,它可以即时编译代码并通过node运行。

npx ts-node src/foo.ts

106
TSC 将 JS 写入磁盘。而 ts-node 则不需要这样做,可直接实时运行 TS。 - basarat
7
提醒一下,ts-node无法记录导入模块中的控制台日志。例如,如果您使用ts-node运行file1.ts文件,并且file1.ts文件在内部使用了file2.ts文件,则来自file2.ts文件的控制台日志将不会被记录。 - Shadab Faiz
22
ts-node 太棒了。通过 npm install -g ts-node 安装后,使用 ts-node your-script.ts 轻松愉快。 - AlwaysLearning
17
自从 deno 发布以来,现在你可以执行 deno run path/to/file.ts 命令,在不将其编译为单独的 JS 文件的情况下运行 TypeScript 文件。 - JMadelaine
10
小心使用Deno,因为它与Node是不同的,可以在Node中正常工作的代码可能无法在Deno中运行(因为内置和npm Node.js包的差异)。 - basarat
显示剩余8条评论

207

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

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

现在运行以下命令来执行一个 TypeScript 文件:

ts-node typescript-file.ts

5
在我看来,这是最好的方法,因为ts-node还提供了TypeScript REPL(交互式解释器)。 - tromgy
9
如果你不想使用全局版本,也可以依赖于 npx ts-node yourscript.ts 运行你的脚本。 - rafaelpivato
25
ts-node 不支持 ES 模块。 - Dan Dascalescu
2
下载的查询已不再有效,请尝试使用npm install typescript --save-dev --global && npm i ts-node -g - 钟智强
关于'@types/node',我建议查看以下链接:https://www.npmjs.com/package/@types/node, https://www.alura.com.br/artigos/typescript-favoreca-o-uso-de-type-definitions [], https://blog.angular-university.io/typescript-2-type-system-how-do-type-definitions-work-in-npm-when-to-use-types-and-why-what-are-compiler-opt-in-types/。 - Eduardo Lucio
ts-node现在支持ES模块,但这种支持仍然是实验性的,因为它依赖于仍处于实验阶段的Node功能。 - RichVel

115

我们有以下步骤:

  1. 首先需要安装TypeScript

npm install -g typescript
  • 创建一个名为helloworld.ts的文件

  • function hello(person){
       return "Hello, " + person;
    }
    let user = "Aamod Tiwari";
    const result = hello(user);
    console.log("Result", result)
    
  • 打开命令提示符并输入以下命令

  • tsc helloworld.ts
    
  • 再次运行该命令

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


  • 25
    针对您的情况,我们运行的是.js文件而不是.ts文件。 - Menai Ala Eddine - Aladdin
    FYI:小心,这将为每个 .ts 文件生成一个 .js 文件。 - mnaa

    54

    你也可以尝试使用 tsx。

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

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

    示例:

    npx tsx ./script.ts
    

    1
    当速度至关重要时,这是一个重要的答案。 - Michael Hays
    1
    同样重要的是,当您只想让它正常工作而没有任何麻烦时,我的情况下所有的替代方案都存在问题。 - Ibrahim ben Salah
    1
    每当 script.ts 被修改时,npx tsx --watch ./script.ts 将被执行。 - Ibrahim ben Salah
    1
    如何使用 Chrome 网页检查工具调试代码? - nvbalaji

    51

    在@Aamod的回答基础上补充一点,如果你想使用一个命令行来编译和运行你的代码,可以使用以下命令:

    Windows:

    tsc main.ts | node main.js
    

    Linux / macOS:

    tsc main.ts && node main.js
    

    6
    运行命令 npm install typescript -g 可以安装全局的 TypeScript 编译器(tsc CLI)。 - s2t2
    6
    好的,我会尽力进行翻译。以下是需要翻译的内容:Ah the windows 'pipe'哦,Windows里的“管道”。 - Rocky Li
    1
    如果你想逐行调试 TypeScript 源代码,这种方法行不通。 - Paramvir Singh Karwal
    如果您在项目中运行TypeScript,则/node_modules/.bin/tsc中已经有一个tsc可执行文件。 这应该是被接受的答案。 - Caleb Lewis

    48

    我创建了@digitak/esrun,它是围绕esbuild的轻量级包装器,几乎瞬间执行TypeScript文件。我制作esrun是因为我对ts-node感到失望:太慢了,而且大多数时候根本不起作用。

    esrun的优点包括:

    • 非常快(使用esbuild),
    • 可以导入ESM和CJS格式的模块(只需使用您选择的库,esrun将直接运行),
    • 包含监视模式,使用--watch选项运行脚本,您的入口文件或其任何依赖项的更改都将重新触发结果
    • 您可以在检查模式下使用esrun来使用DevTools控制台,而不是您的终端控制台。

    安装后,只需运行:

    npx @digitak/esrun file.ts
    

    7
    哇,这正是我寻找了许多小时的东西!我一直无法让 ts-node 正常工作。只需运行 "esrun my-file.ts",就可以轻松地使用了! - Random
    6
    或许需要加上一个小免责声明,说明你是该库的作者? - Robin Métral
    10
    @RobinMétral 嗯,我有时候觉得免责声明很荒谬。我发布这个并不是为了宣传自己,而是为了真正帮助和我有相同需求的人们。ts-node存在问题,速度慢,我想要一个现代的TypeScript运行程序。我也认为这不是我的工作,因为我只是在Evan W令人惊叹的EsBuild库周围写了一个小包装器 - 他才是应该得到所有功劳的人。 - Gin Quin
    3
    谢谢提供链接,@RobinMétral。我不知道这是强制性的。我会更新我的答案。这个库只是一个77行代码的Esbuild包装器,对于77行代码来说,不需要一个由7个协作者组成的团队或扩展测试套件。所有的工作都由Esbuild完成。人们可以使用它或者ts-node或者sucrase-node或其他任何他们喜欢的东西。我个人更喜欢我的库,因为我遇到的问题较少。Estrella看起来很棒,但我不会推荐它用于这个问题(也不会推荐Esbuild),因为它们都是构建工具而不是运行工具。 - Gin Quin
    4
    我不确定为什么没有明确说明,但是要(轻松地)使用它,请执行 npx @digitak/esrun index.ts 命令,并在必要时替换 index.ts - mxcl
    显示剩余6条评论

    47

    编辑:2022年5月

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

    旧回答:

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

    首先,截至2020年3月,ts-node在此情况下无法工作。因此我们可以采用tsc然后跟上node

    其次,TypeScript仍然无法输出.mjs文件。因此我们可以采用.js文件和在package.json中使用"type": "module"

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

    import { Lib } from './Lib';
    

    嗯,这并不简单。Node在导入时需要指定扩展名,除非你使用experimental-specifier-resolution=node标志。在这种情况下,它会使Node在你仅在import行中指定./Lib时查找Lib.jsLib/index.js

    第四点,还有一个问题:如果您的软件包中有与index.js不同的main文件名,Node将无法找到它

    转译使事情变得比运行原生的Node更加混乱。

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


    3
    您可以使用 https://www.npmjs.com/package/@digitak/esrun,该工具能够解决提到的问题。 - Gin Quin
    感谢 @GinQuin!esrun 正好做到了我期望 ts-node 做的事情:只需使用导入运行脚本。 - vlz
    请注意,现在的ts-node支持--esm标志。你的回答是我最喜欢的!你能否更新一下以帮助未来的开发者呢 :) - bcbrian
    审核者注意:@bcbrian - 没有必要编辑此信息,因为您自己发布了答案。新答案包含更新的信息是很自然的事情 - 要得到认可。 - Oleg Valter is with Ukraine
    1
    添加 --esm 无法解决导入时所需的文件扩展名问题。 - Imran

    20

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

    Deno是由Node.js的创建者Ryan Dahl创建的,基于如果他能重新开始,他会做出什么不同的选择。


    5
    这是一个例子:deno run https://deno.land/std/examples/welcome.ts - mozey
    1
    这将是我的首选方法,但在使用Node模块时存在导入/要求问题,这是非常棘手的修复。 - hkong
    随着工具的增加来支持Deno的安全性,我看到它的易用性正在增加。包括导入需要具有完整的相对路径/ URL和文件扩展名。"Deno默认是安全的。因此,除非您明确启用它,否则Deno模块没有文件、网络或环境访问权限,例如。"在开发时添加额外的标志,然后将其锁定:"deno run --unstable --allow-read --allow-env main.ts" -> https://dev.to/mxfellner/node-js-compatibility-using-npm-packages-in-deno-52hh - TamusJRoyce

    11

    对于 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 支持 shebangs 的功能ts-node v8.9.0 版本中正式添加。


    11

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接