【问题标题】:Typescript: How to import classes ("Uncaught ReferenceError")打字稿:如何导入类(“未捕获的 ReferenceError”)
【发布时间】:2015-09-18 13:48:10
【问题描述】:

我是 Typescript 的新手。我喜欢这个想法,编译器会指出大多数错误,因为他真的得到了代码。现在我做了一个测试项目,没有编译器错误,但运行时出现异常:

Uncaught ReferenceError: Boat is not defined(anonymous function) @ Main.ts:7

显然导入不起作用。但为什么?我尝试了 amd 和 commonjs 并得到了同样的错误。

代码如下:

index.html

<!DOCTYPE html>

<html>
<head>
    <title>TypeScript Test</title>
    <script data-main="main" type="text/javascript" src="require.js"></script>
</head>
<body>

<span id="output"></span>

</body>
</html>

Main.ts

///<reference path='Vehicle.ts'/>
///<reference path='Car.ts'/>
///<reference path='Boat.ts'/>

var outputElement = document.getElementById('output');

var vehicleOne: Vehicle.Vehicle = new Boat.Boat("One");
var car: Car.Car = new Car.Car("Two");
var vehicleTwo: Vehicle.Vehicle = car;

outputElement.innerHTML = vehicleOne.do() + " " + vehicleOne.getName() + "<br />"
                        + vehicleTwo.do() + " " + vehicleTwo.getName() + "<br />"
                        + car.do() + " " + car.getName() + " " + car.doCar() + "<br />";

Vehicle.ts

module Vehicle{

    export class Vehicle
    {
        private name: string;

        constructor (name: string)
        {
            this.name = name;
        }

        do() : string
        {
            return "Im a vehicle";
        }

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

}

Car.ts

///<reference path='Vehicle.ts'/>

module Car {

    export class Car extends Vehicle.Vehicle {
        constructor(name:string) {
            super("CAR: " + name);
        }

        do():string {
            return "Im a car";
        }

        doCar():string {
            return "Only cars can do this :)";
        }
    }

}

Boat.ts

///<reference path='Vehicle.ts'/>

module Boat {

    export class Boat extends Vehicle.Vehicle {
        constructor(name:string) {
            super("BOAT " + name);
        }

        do():string {
            return "Im a boat";
        }
    }

}

我使用Webstorm,编译器没有输出错误,并且创建了*.js 和*.map.js 文件。在浏览器中没有输出。只有控制台打印“Uncaught ReferenceError: Boat is not defined(anonymous function) @ Main.ts:7”

为什么会出现这个异常?如何正确导入类?

【问题讨论】:

    标签: javascript class oop typescript webstorm


    【解决方案1】:

    我怀疑您的项目设置为将每个 .ts 文件编译成单独的 .js 文件。如果是这种情况,那么只会加载 Main.js,但不会加载boat.js、car.js 等,这会给你一个错误。

    如果您更改项目以将输出编译为单个文件,那么 TypeScript 编译器将使用 标签来拉入其他 .ts 文件并构建一个您可以使用标签引用的单个 .js 文件。

    如果您使用 Visual Studio,在项目设置的 TypeScript Build 下有一个选项“将 JavaScript 输出合并到文件中”。如果您使用命令行编译器,则 --out 标志可用于生成单个文件- 请参阅http://www.typescriptlang.org/Handbook#modules-splitting-across-files 了解更多信息。

    【讨论】:

    • 谢谢你,真的很管用。我使用 Webstorm 并且已将参数 --out "generated.js" 添加到编译器命令行选项中。 (它在偏好下)。所以在 HTML im 中不再使用“main”,而是“generated”文件。所以谢谢,你修好了:)
    • 很好的答案...但是如果我试图从 test.js 调用 car.js 怎么办...,我不能将它们包含到单个文件中...跨度>
    • 如果您不能制作单个文件,那么您可以在 HTML 中放置两个
    • @MrKWatkins 链接typescriptlang.org/Handbook#modules-splitting-across-files 不再存在...而且我没有找到“将 JavaScript 输出合并到文件中”选项
    【解决方案2】:

    我遇到了类似的问题,这是由于 html 文件没有导入所有的 javascript 文件。为了解决您的情况,您可以将 Vehicle.js、Car.js 和 Boat.js 添加到您的 index.html 文件中。

    【讨论】:

      猜你喜欢
      • 2018-01-21
      • 2016-10-23
      • 2016-12-13
      • 1970-01-01
      • 2017-10-31
      • 1970-01-01
      • 2012-12-26
      • 2019-08-13
      • 2019-12-19
      相关资源
      最近更新 更多