一尘不染

在Node.js中混合JavaScript和TypeScript

node.js

在纯ES6中拥有部分Node.js时,是否可以在同一项目中混入某些Typescript模块?

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


阅读 952

收藏
2020-07-07

共1个答案

一尘不染

是的,这是可能的。

结合以下TypeScript编译器选项

  1. --allowJs

明确支持混合的JavaScript和TypeScript源

  1. --outDir

由于将编译所有文件,因此有必要将结果JavaScript输出到其他目录中,否则输入 .js文件将被覆盖 1

  1. --checkJs

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

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

TypeScript实际上在诸如Visual Studio Code之类的工具中为所有JavaScript智能感知提供了动力。

类型可以放在JSDoc 2 注释中。这些注释可以引用从TypeScript(.ts/ .tsx/
.d.ts)文件导入的类型。像Visual Studio Code这样的IDE将在这些注释中提供语法突出显示和自动完成功能。

但是有一个警告。因为JavaScript中没有类型的清单语法,所以不能单独导入它们,而必须将其附加到导入的
上。这可以通过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) {}

笔记:

*--outDir 如果另外指定该--noEmit标志,则不需要 *1
:当使用诸如SystemJS(带有plugin-
typescript)或Webpack(带有awesome-
typescript
-loaderts-loader)之类的工具托管TypeScript编译时,您可以执行此操作。如果您使用TS Node,则同样适用。

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

备注:

尽管此问题和答案都是关于导入类型以在JavaScript文件中使用的,但由于编译器将从表达式的值中推断类型,因此通常是不必要的。

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

2020-07-07