【问题标题】:How to interoperate from js to Typescript?如何从 js 到 Typescript 互操作?
【发布时间】:2020-01-16 23:28:23
【问题描述】:

我对 Flow、Typescript 和类似的超集 javascript 语言的使用有疑问。

如何从纯 js 代码中调用 Typescript 编写的内容?

这个机制看起来像 Scala 和 Java 的互操作吗?喜欢下面的文章。

https://blog.akquinet.de/2011/07/20/integrating-scala-components-in-a-java-application/

【问题讨论】:

  • 为了获得您在 S/O 上所需的帮助,我建议您分享您的代码并准确说明您遇到问题的位置。
  • Typescript 总是(至少在默认情况下)编译为纯 javascript,因此您可以在纯 js 项目中使用所有已编译的 TS 项目。这个问题是关于如何以某种形式的模块编译 TS 以及如何在 JS 中导入它?在这种情况下,这个问题将从澄清的重写中受益匪浅。
  • 我很抱歉缺乏相关的细节/上下文,我最初的意图是询问如何使用 javascript 语法使用转译的 typescript/flow-js 库?强调“转译”,这意味着在超集语言被转换为 Javascript 之后。当我使用 Scala–Java 类比时,我的意思与如何在 java 中使用 Scala 转译二进制文件的方式相同。喜欢下面的文章:blog.akquinet.de/2011/07/20/…

标签: javascript typescript flowtype pure-js


【解决方案1】:

Typescript 库通常会被编译成 .js 和 .d.ts 文件,前者以编译代码为特色,后者以 Typescript 类型 AKA 类型声明为特色。

如果您在源代码中使用 Typescript,通常编译器应在编译过程中提取这些 .d.ts 文件(解析模块依赖项)。

如果您将纯 Jabba-the-Hutt-script 用于您的源代码,这些 .d.ts 将方便您的编辑器提供建议、错误突出显示和其他内容。如果你使用 Babel(如果你这样做了,也可以用一个成熟的 tsc 代替),在编译步骤中将会有更多的签名重新检查。

关于 Flow - 除非你是 Evan,否则谁在乎 Flow。你在 2016 年致力于 Vue 2.x.x。

但实际上没有,我出去阅读网站上的文档,看起来编译器输出了一个 js 文件的版本,去掉了你的类型注释,它以 Babel 插件和独立应用程序的形式存在叫flow-remove-types。与tsc 所做的相反,没有提到在编译过程后会保留输入信息。

就我在 Node 环境编程方面的经验而言,看起来你应该静态链接库,使用源代码本身来获取类型信息,因为在编译后它被剥离了,呵呵。

但是来吧,正如我之前提到的,Flow 无论如何都被认为已弃用,没有理由在 Typescript 上使用它。

下面的旧答案

您将此与 Java 和 Scala 关系的类比是无效的。更像是 JVM 指令集和 Java(或 Scala,或几乎每一种被编译成 JVM 字节码的语言)本身之间的关系。

假设你在字节码中写了一些东西,你需要在 Java 领域的某个地方调用一些签名。需要考虑的事项:

  1. 访问语义,即在普通 JVM 语法环境中可用的 Java 内容,它叫什么,在 JVM 规则之上是否有任何自定义调用约定
  2. ???
  3. 如果有什么想法,我会在编辑中添加更多内容。

所以当涉及到 Typescript(以及 Flow 太 AFAIK)时,我们有以下几点:

  1. 没有自定义调用约定,例外是纯 JS。
  2. 函数被转换为 1 到 1。
  3. 类转译取决于目标,但签名和用法应该从 ES5 到 ESNext 基本上等价。
  4. 不确定命名空间是如何实现的,但我敢打赌 15 卢布,命名空间的所有子成员最终都会作为可作为命名空间名称访问的对象的道具,呵呵。
  5. 使用模块系统应该很简单。
  6. ???
  7. 如果我记得任何重要的事情,我会添加更多,但这些应该涵盖大约 95% 的情况。

另外,请注意,没有“从 JVM 字节码调用 Java 代码”这回事,就像没有“从 .NET CIL 调用 C# 代码”和“调用 C 代码”一样来自 LLIR”。源代码已经过去了,剩下的是它的编译形式。您可能会也可能不会将编译后的版本“源映射”到源代码,本质上允许导航甚至调试,但是您调用的代码与源代码不同。

P.S.:不建议我在上面写的所有内容,这是一个 hack。您依赖于编译器的输出,因此依赖于它的特定实现。您可能应该做的是使用 Typescript 编译您的 js 代码并让编译器注意互操作

P.P.S.:上次我检查时,facebook/flow 已被弃用,自 TSC 发布以来,强烈建议您永远不要使用 NOT Typescript 启动项目。

P.P.P.S.:CommonJS 不是 Javascript 的超集。 CommonJS 甚至不是一种语言。

【讨论】:

  • 我很抱歉缺乏相关的细节/上下文,我最初的意图是询问如何使用 javascript 语法使用转译的 typescript/flow-js 库?强调“转译”,这意味着在超集语言被转换为 Javascript 之后。当我使用 Scala–Java 类比时,我的意思与如何在 java 中使用 Scala 转译二进制文件的方式相同。喜欢下面的文章:blog.akquinet.de/2011/07/20/… 关于 CommonJS,我同意它不是语言。它是 Javascript 模块系统,可能与提出的问题有关
  • 我不确定是否已弃用,但根据 facebook/flow 存储库,最新提交仅在 4 天前。
  • @Mistletoe 我更新了答案。此外,来吧,Java 和 .NET 仍在每天更新,地狱,很确定有库是用 FORTRAN 编写的。但是,如果您有选择的话,您实际上不会在任何这些技术中从头开始新的代码库。 (什么都不知道==别无选择)
  • @Mistletoe monsieur?
猜你喜欢
  • 2013-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
相关资源
最近更新 更多