”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Node.js 没有实现 TypeScript

Node.js 没有实现 TypeScript

发布于2024-11-01
浏览:605

Node.js did not implement TypeScript

一篇关于 Node.js 没有实现 TypeScript 的原因的简短文章。

首先要事

接下来是 Node.js 中关于 TypeScript 的已经尚未完成的解释。

本文无意批评 Node.js 团队或 TypeScript 团队。

事实上,恰恰相反。

我认真地认为 Node.js 团队在按照他们的方式“实现”TypeScript 方面做出了最佳选择。

我在这里真正强调的是 Node.js 没有实现 TypeScript。他们只是添加了某种支持。我认为这是一个重要的区别,在有关 Node.js 和 TypeScript 的讨论中经常被忽视。

在过去的几周里,我统计了我读过的时事通讯中引用的 50 多篇文章提到 Node.js 实现了 TypeScript。

我认为是时候彻底澄清这一点了。

剧透警告:Node.js 未实现 TypeScript。

TypeScript:简史和一些数据

2010 年,微软发布了 TypeScript,这是 JavaScript 的超集,为该语言添加了静态类型。 TypeScript 旨在解决 JavaScript 的一些缺点,例如缺乏类型安全性和维护大型代码库的困难。自发布以来,TypeScript 受到了开发人员的欢迎,许多项目都采用它作为主要语言。

根据最新的 JS 现状调查,TypeScript 几乎无处不在。 78% 的开发人员至少 50% 的开发时间都在使用 TypeScript,因此难怪 “Node.js 实现了 TypeScript” 的回声甚至到达了 Web 最深刻的角落。

但是,需要澄清的是,这并没有发生。它可能永远不会。

问题

Node.js 没有实现 TypeScript 有几个原因。以下是我认为最重要的两个:

#1:TypeScript 在运行时注入东西。

你知道枚举在运行时会变成什么吗?一个对象。

幸运的是,这只是 TypeScript 如何在运行时注入东西的几个例子之一。这对于 Node.js 来说是一个问题,因为这意味着运行时必须了解 TypeScript 的功能,这会带来大量的复杂性和开销。

如果 Node.js 希望保持与 ECMAScript 的一致性,并且在其余下的存在中不必处理依赖关系管理,则它不能接受 TypeScript 作为当前形式的依赖关系。

#2:语义版本控制。

TypeScript 不遵循语义版本控制 (semver)。

另一方面,Node.js 严格遵循 semver,并具有三个不同的发行版(目前,我们有 18.x、20.x、22.x)。这意味着可以在次要版本或补丁版本中引入重大更改,这可能会导致现有代码的兼容性问题。

此外,支持的平台数量巨大,因此控制一切并不容易。

Node.js 根本无法接受 TypeScript 作为依赖项,因为它会破坏 semver。这是阻止 Node.js 实现 TypeScript 的一个根本问题。

那么,他们做了什么?

这就是混乱出现的地方。 Node.js 没有实现 TypeScript,但他们确实在实验性标志下添加了类型剥离。此功能允许开发人员编写 TypeScript 代码并将其编译为 JavaScript,而无需类型信息。这是一种妥协,允许开发者在 Node.js 中使用 TypeScript,而不会引入上述问题。

你想要一个例子吗?干得好:

function sum(a: number, b: number): number {
  return a   b;
}

这个函数,当使用 --experimental-strip-types 标志编译时,将变成:

function sum(a        , b        )         {
  return a   b;
}

你看到了吗?类型消失了,并被空格取代。 但是,为什么?,您可能会问。好吧,因为这样做可以保留源映射引用,而无需为这些引用进行单独的构建过程。

在内部,这是通过一个名为 amaro 的包来完成的,它包装了 swc——一个著名的构建工具,它执行实际的剥离。

当然,限制是存在的,例如无法使用 TypeScript 特定的功能,如前面提到的 enums。但是,这仍然是向前迈出的一大步,可以防止人们编写 135 个配置文件来使 sum 函数接受两个数字并返回第三个数字。

再见,
迈克尔。

版本声明 本文转载于:https://dev.to/cadienvan/nodejs-did-not-implement-typescript-1k4p?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-07-20
  • 您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    您可以使用CSS在Chrome和Firefox中染色控制台输出吗?
    在javascript console 中显示颜色是可以使用chrome的控制台显示彩色文本,例如红色的redors,for for for for错误消息?回答是的,可以使用CSS将颜色添加到Chrome和Firefox中的控制台显示的消息(版本31或更高版本)中。要实现这一目标,请使用以下模...
    编程 发布于2025-07-20
  • 如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    如何解决AppEngine中“无法猜测文件类型,使用application/octet-stream...”错误?
    [ appengine静态文件mime type override ,静态文件处理程序偶尔可以覆盖正确的mime类型,在错误消息中导致错误消息:“无法猜测mimeType for for File [使用[File]。 application/application/octet-stream ....
    编程 发布于2025-07-20
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-20
  • Python环境变量的访问与管理方法
    Python环境变量的访问与管理方法
    Accessing Environment Variables in PythonTo access environment variables in Python, utilize the os.environ object, which represents a mapping of envir...
    编程 发布于2025-07-20
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-07-20
  • 解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    解决MySQL插入Emoji时出现的\\"字符串值错误\\"异常
    Resolving Incorrect String Value Exception When Inserting EmojiWhen attempting to insert a string containing emoji characters into a MySQL database us...
    编程 发布于2025-07-20
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-07-20
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-07-20
  • Python中何时用"try"而非"if"检测变量值?
    Python中何时用"try"而非"if"检测变量值?
    使用“ try“ vs.” if”来测试python 在python中的变量值,在某些情况下,您可能需要在处理之前检查变量是否具有值。在使用“如果”或“ try”构建体之间决定。“ if” constructs result = function() 如果结果: 对于结果: ...
    编程 发布于2025-07-20
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。The recommended approach to correct the data is t...
    编程 发布于2025-07-20
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-07-20
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    无法连接到mySQL数据库:故障排除错误消息要调试问题,建议将以下代码添加到文件的末尾.//config/database.php并查看输出: ... ... 回声'... echo '<pre>'; print_r($db['default']); echo '</pr...
    编程 发布于2025-07-20
  • C++成员函数指针正确传递方法
    C++成员函数指针正确传递方法
    如何将成员函数置于c [&& && && && && && && && && && &&&&&&&&&&&&&&&&&&&&&&&华仪的函数时,在接受成员函数指针的函数时,要在函数上既要提供指针又可以提供指针和指针到函数的函数。需要具有一定签名的功能指针。要通过成员函数,您需要同时提供对象指针(此...
    编程 发布于2025-07-20
  • Java中Lambda表达式为何需要“final”或“有效final”变量?
    Java中Lambda表达式为何需要“final”或“有效final”变量?
    Lambda Expressions Require "Final" or "Effectively Final" VariablesThe error message "Variable used in lambda expression shou...
    编程 发布于2025-07-20

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3