首页 > 解决方案 > 如何从 js 到 Typescript 互操作?

问题描述

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

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

该机制看起来像 Scala 和 Java 的互操作吗?就像下面的文章。

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

标签: javascripttypescriptflowtypepure-js

解决方案


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

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

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

关于 Flow——除非你是 Evan,否则谁会关心 Flow,你在 2016 年致力于 Vue 2.xx。

但实际上没有,我出去阅读网站上的文档,看起来编译器输出了一个版本的 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 卢布,命名空间的所有子成员最终都作为一个对象的道具,可以作为命名空间的名称访问,duh。
  5. 使用模块系统应该很简单。
  6. ???
  7. 如果我记得任何重要的事情,我会添加更多,但这些应该涵盖大约 95% 的情况。

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

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

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

PPPS:CommonJS 不是 Javascript 的超集。CommonJS 甚至不是一种语言。


推荐阅读