导入模块打字稿错误

时间:2018-03-17 05:03:43

标签: javascript typescript import module

当我在app.ts脚本中导入模块时,' .js'编译的js文件的导入行中缺少文件扩展名。

app.ts import {ModuleA} from './ModuleA'

编译了app.js import {ModuleA} from './ModuleA';

我将其包含在html文件中,如<script type="module" src="app.js"></script>

但浏览器无法找到模块&#39; ModuleA&#39;。

只有在我导入import {ModuleA} from './ModuleA.js'

时才有效

但我想通过导入&#39; .ts&#39;模块文件,而不是&#39; .js&#39;模块文件。

我希望ts编译添加&#39; .js&#39;扩展到进口线。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

似乎这是打字稿中的一个错误。 https://github.com/Microsoft/TypeScript/issues/13422

目前还没有解决方案。目前,您的方法是正确的。

import {ModuleA} from './ModuleA.js'

答案 1 :(得分:1)

您也可以使用webpack构建单个js文件。然后您不需要添加扩展名。

请参阅guide for setting up webpack for typescript

答案 2 :(得分:1)

如果未在tsc的命令行中指定编译器选项,并且您没有tsconfig.json文件,则typescript将使用默认值。根据{{​​3}},发出的语言的默认值为es3,模块加载器的默认值为commonjs。我发现这些选项不可接受,因此我在tsconfig.json文件中指定了不同的选项。尝试按如下方式设置项目,我认为您会对结果感到满意。这可能看起来很多工作,但您可以在完成后将项目导出到模板,并且您不必再次执行此操作。这假设您已在计算机上设置npm

在VS 2017中创建一个新项目,选择ASP.NET Web应用程序(.NET Framework)作为模板。我知道这可能听起来不对,但请耐心等待,因为你最终会得到一个不包含你不想要的东西的最小项目。在向导的下一页上,选择“清空”并取消选中每个框,然后不进行身份验证。完成向导。

在项目的根级添加以下文件。

的package.json:

{
  "version": "1.0.0",
  "name": "asp.net",
  "author": "you",
  "private": true,
  "dependencies": {
    "core-js": "^2.5.3",
    "systemjs": "^0.21.0"
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "module": "system",
    "target": "es5",
    "noImplicitAny": true,
    "noEmitOnError": true,
    "sourceMap": true
  },
  "files": [
    "app/app.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

system.config.js:

(function (global) {
  SystemJS.config({
    paths: {
      'npm:': '/node_modules/'
    },
    map: {
      app: '/app'
    },
    packages: {
      app: {
        main: 'app.js',
        defaultExtension: 'js'
      }
    }
  })
})(this);

的index.html:

<!DOCTYPE html>
<html>
<head>
  <base href="/" />
  <meta charset="utf-8" />
  <title>Typescript with SystemJS and Modules Demo</title>
  <script src="node_modules/core-js/client/shim.min.js"></script>
  <script src="node_modules/systemjs/dist/system.js"></script>
  <script src="system.config.js"></script>
  <script>
    SystemJS.import("app/app.js").catch(function (e) { console.log(e); });
  </script>
</head>
<body>
  <div id="personDiv"></div>
</body>
</html>

此外,创建一个app文件夹并将以下两个文件放入其中:

app.ts:

import { Person } from "./person";

export class App {
  constructor() {
    let person: Person = new Person();
    let div: HTMLDivElement = <HTMLDivElement>document.getElementById('personDiv');
    div.innerHTML = person.getName();
  }
}

// Use this assignment to start execution.
let a: App = new App();

// The following doesn't appear to work with SystemJS. It does with plain TypeScript.
// It is probably because SystemJS already defines a listener for window.onload,
// although I haven't verified that.
//window.onload = () => {
//  let a: App = new App();
//  let person = new Person();
//  alert(person.getName);
//}

person.ts:

export class Person {
  fullName: string;

  constructor() {
    this.fullName = "Test Guy";
  }

  getName():string {
    return this.fullName;
  }
}

然后构建并运行应用程序。结果应该表明导入工作正常。