在Node.js中混合使用JavaScript和TypeScript

时间:2018-04-03 22:41:27

标签: javascript node.js typescript jsdoc

虽然在ES6中有部分Node.js,但是可以在同一个项目中混合一些Typescript模块吗?

E.g。在TypeScript中定义了一些通过require导入到普通ES6文件中的类型?

1 个答案:

答案 0 :(得分:14)

是的,这是可能的。

合并以下编译器标志

  1. --allowJs

    明确支持混合JavaScript和TypeScript源

  2. --outDir

    由于所有文件都将被转换,因此必须将生成的JavaScript输出到另一个目录,否则输入 .js个文件将被覆盖 1

  3. --checkJs

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

  4. 对于在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) {}
    

    备注:

    1 :如果您另外指定--outDir标志,则无需--noEmit。您可以在使用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选项,您可以逐个文件地执行此操作,如上所述。