javascript - 如何从 js 到 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——除非你是 Evan,否则谁会关心 Flow,你在 2016 年致力于 Vue 2.xx。
但实际上没有,我出去阅读网站上的文档,看起来编译器输出了一个版本的 js 文件,其中去掉了你的类型注释,它以 Babel 插件和名为flow-remove-types
. 与所做的相反,没有提及在编译过程之后会保留键入信息tsc
。
就我在 Node 环境编程方面的经验而言,有点像你应该静态链接库,使用源代码本身来获取类型信息,因为在编译之后它被剥离了,呵呵。
但是来吧,正如我之前提到的,Flow 无论如何都被认为是弃用的,没有理由在 Typescript 上使用它。
下面的旧答案
您将此与 Java 和 Scala 关系的类比是无效的。更像是 JVM 指令集和 Java(或 Scala,或几乎每一种被编译到 JVM 字节码中的语言)本身之间的关系。
在那,假设你在字节码中写了一些东西,你需要在 Java 领域的某个地方调用一些签名。需要考虑的事情:
- 访问语义,即在普通 JVM 语法环境中可用的 Java 内容,它叫什么,在 JVM 规则之上是否有任何自定义调用约定
- ???
- 如果有任何想法,我会在编辑中添加更多内容。
因此,当谈到 Typescript(以及 Flow 太 AFAIK)时,我们有以下内容:
- 没有自定义调用约定,例外是纯 JS。
- 函数被转换为 1 到 1。
- 类转译取决于目标,但签名和用法应该从 ES5 到 ESNext 基本上等效。
- 不确定命名空间是如何实现的,但我打赌 15 卢布,命名空间的所有子成员最终都作为一个对象的道具,可以作为命名空间的名称访问,duh。
- 使用模块系统应该很简单。
- ???
- 如果我记得任何重要的事情,我会添加更多,但这些应该涵盖大约 95% 的情况。
另外,请注意,没有“从 JVM 字节码调用 Java 代码”这样的东西,就像没有“从 .NET CIL 调用 C# 代码”和“从 LLIR 调用 C 代码”这样的东西。 . 源代码已经过去了,剩下的是它的编译形式。您可能会或可能不会将编译后的版本“源映射”到源代码,本质上允许导航甚至调试,但是您调用的代码与源代码不同。
PS:不建议我上面写的所有内容,这是一个hack。您依赖于编译器的输出,因此依赖于它的特定实现。您可能应该做的是使用 Typescript 编译您的 js 代码,并让编译器注意互操作。
PPS:我上次检查时,facebook/flow
自 TSC 发布以来已弃用,强烈建议您永远不要使用 NOT Typescript 启动项目。
PPPS:CommonJS 不是 Javascript 的超集。CommonJS 甚至不是一种语言。
推荐阅读
- python - DataFrame 游戏:返回与第一个较低或相等日期时间匹配的所有记录
- amp-html - 如何修复(或删除)AMP 错误的缓存链接
- schedule - 为 ResourcePool 设置多个计划
- r - data.table 大小和 datatable.alloccol 选项
- javascript - 在生成器函数中使用 yield 时,Typescript 不会推断承诺类型
- reactjs - 编辑按钮应该只能应用于列表中的一项
- c - 如何在 CLION 上将 -lrt 链接到 Cmakefile?
- tensorflow - TensorFlow 形状不匹配
- c# - EF6 - 多对一关系不起作用
- android - 将带有参数的 Firebase 动态链接连接到云函数以在 React Native 应用程序中重置用户密码