【问题标题】:Typescript compilation doesn't add require statement to some filesTypescript 编译不会向某些文件添加 require 语句
【发布时间】:2016-09-04 14:09:42
【问题描述】:

我正在做一个非常简单的 nodejs 项目到 typescript 的转换。节点项目的前 2/main 文件已正确转译。除了文件顶部的 requires 语句外,第三个已转译以引入依赖项。

我确定找到了依赖项,因为 VSCode 可以自动完成和着色依赖项对象,并且没有编译器错误。这 3 个文件中的每一个都使用 ts import 语句而不是 requires。

由于它适用于 3 个文件中的 2 个,而且它们基本相同,我不知道从哪里开始。这听起来像一个编译问题吗?

    //tsconfig.json
    {
        "compileOnSave": true,
        "compilerOptions": {
            "module": "commonjs",
            "sourceMap": true,
            "target": "es6",
            "moduleResolution": "node",
            "allowUnreachableCode" : true,    
            "listFiles":true,
            "outDir":"js",
            "watch": true

        },
        "files": [
            "./typings/index.d.ts",
            "./src/route.ts",
            "./src/app.ts",
            "./src/email.ts",
            "./spec/email.spec.ts"
        ]
    } 

//email.ts
"use strict";

import * as sendgrid from "sendgrid";

    export class mailer{

        public Send(){

            let sendGridAcctUser = "dina@dfberry.io";
            let sendGridAcctKey: string = "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";           

            let toEmail = "admin@dfberry.io";
            let fromEmail = "dinaberry@outlook.com";
            let mysubject = "test email";
            let mytext = "this is a test";

            let options: Sendgrid.EmailOptions;
            options.subject = mysubject;
            options.text = mytext;
            options.to = toEmail;
            options.from = fromEmail;
            options.replyto = fromEmail;

            let myEmail: Sendgrid.Email;
            myEmail = new Sendgrid.Email(options);

            //let emailer : SendGrid;
            let sg : Sendgrid.Constructor;

            let sgInstance : Sendgrid.Instance;

            sgInstance = new sg(sendGridAcctUser, sendGridAcctKey);

            sgInstance.send(options, function( err, json){
                console.log(err);
                console.log(json);
            } );
        }
    }

    // compiled email.js -- expect requires after "use strict"
    "use strict";
    class mailer {
        Send() {
            let sendGridAcctUser = "dina@dfberry.io";
            let sendGridAcctKey = "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";
            let toEmail = "admin@dfberry.io";
            let fromEmail = "dinaberry@outlook.com";
            let mysubject = "test email";
            let mytext = "this is a test";
            let options;
            options.subject = mysubject;
            options.text = mytext;
            options.to = toEmail;
            options.from = fromEmail;
            options.replyto = fromEmail;
            let myEmail;
            myEmail = new Sendgrid.Email(options);
            //let emailer : SendGrid;
            let sg;
            let sgInstance;
            sgInstance = new sg(sendGridAcctUser, sendGridAcctKey);
            sgInstance.send(options, function (err, json) {
                console.log(err);
                console.log(json);
            });
        }
    }
    exports.mailer = mailer;

【问题讨论】:

  • 在这第三个文件中,代码中是否使用了被移除的导入变量?
  • 你能发布一些代码吗?至少文件 3 中的导入语法
  • 我已将其缩小到编译器认为代码与 sendgrid 无关,因此它删除了该导入语句。我不确定为什么 VSCode 可以找到它的智能感知,但 tsc 不能。
  • 感谢 Nitzan 和 Paarth,虽然您没有给我答案,但您给了我足够的线索,让我知道应该关注什么。 import 语句使用小写的 s,而内部代码使用大写的 S。这就是问题所在。一旦我将导入语句更改为使用大写的 S,然后代码匹配导入并将引用编译到 js 文件。

标签: node.js typescript compilation commonjs


【解决方案1】:

您的问题是以下行已从输出中删除:

import * as sendgrid from "sendgrid";

这是意料之中的。如果在 variable 位置的文件中没有使用导入,则将其删除。

修复:

类似下面的方法会起作用:

 import * as sendgrid from "sendgrid";
 const _ensure = sendgrid;

更多

确保此处涵盖导入https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多