【问题标题】:Mixing JavaScript and TypeScript in Node.js在 Node.js 中混合使用 JavaScript 和 TypeScript
【发布时间】:2018-04-03 22:41:26
【问题描述】:

虽然在纯 ES6 中包含部分 Node.js,但是否可以在同一个项目中混入一些 Typescript 模块?

例如在 TypeScript 中定义了一些通过 require 导入到普通 ES6 文件中的类型?

【问题讨论】:

  • 不,它们需要编译成 JavaScript。 TypeScript 在编译之前不是(必然)在语法上有效的 JS。

标签: javascript node.js typescript jsdoc


【解决方案1】:

是的,这是可能的。

结合以下 TypeScript 编译器选项

  1. --allowJs

    明确支持混合 JavaScript 和 TypeScript 源

  2. --outDir

由于所有文件都将被转译,因此有必要将生成的 JavaScript 输出到不同的目录,否则输入 .js 文件将被覆盖1

  1. --checkJs

这完全是可选的。如果指定,编译器将对 JavaScript 文件进行类型检查,报告错误,就像在 TypeScript 文件中一样,否则它会容忍不一致。

至于在JavaScript文件中使用TypeScript文件中声明的类型,确实可以做到。

TypeScript 实际上为 Visual Studio Code 等工具中的所有 JavaScript 智能感知提供支持。

类型可以放在 JSDoc2 cmets 中。这些 cmets 可以引用从 TypeScript (.ts/.tsx/.d.ts) 文件导入的类型。像 Visual Studio Code 这样的 IDE 将在这些 cmets 中提供语法高亮和自动补全。

但是有一个警告。因为 JavaScript 中的类型没有清单语法,所以它们不能单独导入,而必须附加到导入的 value 上。这可以通过 TypeScript 的声明合并最方便地实现,如下所示。

例子:

a.ts

export default createThing;

function createThing(...args): createThing.Thing  {...}

namespace createThing {
  export interface Thing {...}
}

b.js

import createThing from './a';

/**
 * @param {createThing.Thing} thing
 */
export function takesThing(thing) {}

注意事项:

1:如果您另外指定--noEmit 标志,则不需要--outDir。当使用诸如SystemJS(带有plugin-typescript)或Webpack(带有ts-loader)之类的工具来托管TypeScript 转译器时,您会这样做。如果您使用的是TS Node,这同样适用。

2:虽然称为JSDoc cmets,但它们是在 TypeScript 类型系统的上下文中解释的,不是 JSDoc 系统。 TypeScript 和 Google 的 Closure Compiler 等语言和工具有效地劫持了 JSDoc 语法以实现其自身目的,从而赋予其构造潜在的冲突含义。这通常不是问题,但值得了解,因为很难确定这些 cmets 的适用性和正确性以及它们引用或声明的类型的兼容性。

备注:

虽然这个问题和答案都是关于导入类型以供在 JavaScript 文件中使用,但通常没有必要,因为编译器会根据表达式的值推断类型。

还值得一提的是,如果您发现自己需要编写大量 JSDoc 样式的类型注释,则几乎可以肯定将文件转换为 TypeScript 会更好,因为在 JSDoc 中表达类型的语法很笨拙。感谢--allowJs 选项,您可以逐个文件地执行此操作,如上所述。

【讨论】:

  • 谢谢,这似乎有效。我还可以在b.js 中混合require()import 吗?
  • @AlexanderZeitler 混合 importrequire 是正交的 - 它会按照你说的那样工作。是否可以使用require 取决于您指定的模块格式(--module)。如果您指定 systemes2015,则可以使用 require,因为这些格式不提供它。如果您指定amdcommonjsumd,则可以使用它。但是,将它们混合是个坏主意。
  • 感谢您的解释。混合目前仅用于迁移目的。
  • 迁移不需要混合,因为导入将被转译。
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 2019-10-17
  • 2013-09-16
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
相关资源
最近更新 更多