打字稿:如何导入类("Uncaught ReferenceError")

Mor*_*kel 10 javascript oop class webstorm typescript

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

未捕获的ReferenceError:未定义船(匿名函数)@ 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>
Run Code Online (Sandbox Code Playgroud)

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 />";
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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 :)";
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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";
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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

为什么这个例外?如何正确导入类?

MrK*_*ins 8

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

如果更改项目以将输出编译为单个文件,则TypeScript编译器将使用<reference>标记来引入其他.ts文件并构建可以使用标记引用的单个.js文件.

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

  • @MrKWatkins链接http://www.typescriptlang.org/Handbook#modules-splitting-across-files不再存在...而且我没有找到"将JavaScript输出合并到文件中"选项 (2认同)