如何从 js 到 Typescript 互操作?

How to interoperate from js to Typescript?

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

如何从纯js代码调用用Typescript写的东西?

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

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

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

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

如果您使用纯 Jabba-the-Hutt-script 作为您的源代码,这些 .d.ts 将派上用场,您的编辑可以提供建议、错误突出显示和其他内容。如果您使用 Babel(如果您使用它,也可以替代成熟的 tsc),那么在编译步骤中很可能会有更多的签名重新检查。

关于 Flow——谁会关心 Flow,除非你是 2016 年在 Vue 2.x.x 工作的 Evan You。

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

就我在 Node 环境编程方面的经验而言,有点像你应该静态地 link 库,使用源代码本身来获取类型信息,因为在编译之后它被剥离了,呃。

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

下面是旧答案

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

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

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

因此,当涉及到 Typescript(以及 Flow AFAIK)时,我们有以下内容:

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

此外,请注意没有 "calling Java code from the JVM bytecode" 之类的东西,就像没有 "calling C# code from .NET CIL" 和 "calling C code from LLIR" 这样的东西一样。源代码已经过时了,剩下的就是它的编译形式。您可能会或可能不会 "source-map" 编译版本到源代码,本质上允许导航甚至调试,但是您调用的代码仍然与源代码不同。

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

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

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