【问题标题】:Are there any engines to execute TypeScript code directly?是否有任何引擎可以直接执行 TypeScript 代码?
【发布时间】:2021-11-17 23:19:34
【问题描述】:

当我第一次学习 TypeScript 时,我发现 node.js 不执行 TypeScript,所以你需要安装一个 TypeScript 编译器,将你的 TypeScript 代码转换为 JavaScript。

我搜索直到找到 ts-node(TypeScript 执行和 REPL for node.js),但是当我阅读文档时,我发现它们也是如此(here)。甚至 deno(JavaScript 和 TypeScript 的现代运行时)也在做同样的事情 (here)。

所以我的问题是:是否有任何引擎可以在不将其转换为 JavaScript 的情况下执行 TypeScript 代码?

【问题讨论】:

  • are there any engines to execute TypeScript code without converting it to JavaScript? 我不知道。这样做会有什么好处吗?似乎要实现很多工作,并且与删除类型(这基本上是转译打字稿是什么)然后使用现有的 javascript 引擎具有相同的结果
  • 由于TS没有规范,直接执行TS可能会有问题
  • @captain-yossarian 你指的是 ECMAScript 规范吗?
  • 我的意思是 TS 根本没有任何规范,它完全依赖于 JavaScript,而 JavaScript 又拥有自己的 ECMAScript 规范。想象一下,你想为某种语言编写一个没有规范的编译器,你会怎么做?
  • 是的,我知道这一点,但我问的是在不先将其转换为 JavaScript 的情况下执行 TypeScript

标签: node.js typescript deno ts-node


【解决方案1】:

不,TypeScript 不是那种意义上的“独立”语言。它现在并且永远都是 JavaScript 的超集。这就是 TypeScript 编译器通常被称为 transpiler 的原因:它不会编译为低级语言。在tsc 运行检查后,它现有源代码通过简单地剥离所有 TypeScript 构造来转换为 JavaScript。

来自intro of the official TypeScript Handbook

TypeScript 的目标是成为 JavaScript 程序的静态类型检查器 - 换句话说,一个在代码运行之前运行的工具(静态)并确保程序的类型正确(类型检查)。

所以为了执行 TypeScript,你总是需要一个 JavaScript 引擎。您也可以调整现有的 JavaScript 引擎(或构建自己的引擎)来理解 TypeScript,但它始终首先必须是符合 the ECMAScript specification.

的引擎

Deno 也不例外。它有一个内置的 TypeScript 编译器,即a copy of the official one。来自TypeScript chapter of the Deno manual

在高层次上,Deno 将 TypeScript(以及 TSX 和 JSX)转换为 JavaScript。它通过我们在 Deno 中构建的 TypeScript 编译器和一个名为 swc 的 Rust 库的组合来实现这一点。当代码经过类型检查和转换后,它会存储在缓存中,为下一次运行做好准备,而无需再次将其从源代码转换为 JavaScript。

转译后,Deno 在 Google 的 V8 引擎(与 NodeJS 和 Chrome 中使用的引擎相同)上运行输出 JavaScript。

【讨论】:

  • Deno 怎么样?它不执行 TypeScript 吗? “Deno 的一个好处是,当在 Deno 中运行代码时,它将 TypeScript 视为一等语言,就像 JavaScript 或 Web Assembly。这意味着您可以运行或导入 TypeScript,而无需安装任何其他东西。 Deno CLI。”
  • 这取决于你如何看待它。是的,它“执行”TypeScript,因为您可以直接向它提供 TypeScript 文件,而无需先运行 tsc。但在内部,它只是为您执行tsc。 Deno 附带了一个内置的 TypeScript 编译器,它是官方版本的副本。转译后的 JavaScript 然后在 Google 的 V8 引擎上运行,与 NodeJS 或 Chrome 没有什么不同。
  • 问题是“是否有任何引擎可以直接执行 TypeScript 代码?” 显而易见的答案是:可以。 Deno 将在内部为您处理此问题。当然,每种编程语言都必须翻译成机器代码(在一个或多个步骤中)。没有可以运行 JavaScript 或 C++ 或任何其他语言的 CPU。
  • 我不认为答案是明显的。作者已经在他们自己的帖子中提到,他们不将 Deno 视为 TypeScript 引擎,因为在内部它只运行与您手动运行相同的转译器。这就是为什么我在评论中写道“这取决于你如何看待它”。如果您将 Deno 视为黑盒,是的,它“运行”TypeScript。但对我来说,V8 引擎是执行代码的引擎,而该代码是 JavaScript。对我来说,从 TS 到 JS 的隐式转换是 Deno 的开发者便利特性,而不是它与 Node+TS 的操作方式的根本区别。
  • 所以您是说如果不将 TypeScript 转换为 JavaScript,就不可能编写一个解释和评估 TypeScript 的引擎?你确定这不存在,即使作为概念的科学证明?
猜你喜欢
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2017-03-24
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多