为什么我的TypeScript有时会给我一个实例,有时候给我一个课程?

Ste*_*unn 6 javascript html5-canvas typescript microsoft-edge

我正在编写一个应用程序来学习TypeScript.它在Chrome中运行良好,但在Edge中运行时遇到问题.我有这个方法:

 set position(pos: Point) {
        const diffAsPoint = pos.minus(this.canvasPos);

        let diff: Vector2D = diffAsPoint.toVector2D(); // <--- this line
        if (diff instanceof Vector2D) {
            console.info("is a vector!");
        } else {
            console.info("not a vector!");
        }
Run Code Online (Sandbox Code Playgroud)

我看到的是,有时,DIFF是一个Vector2D而不是作为一个实例一个Vector2D.显然,当发生这种情况时,对它的任何操作都会导致aObject doesn't support property or method ...

调试器显示类而不是实例

方法toVector2D很简单:

toVector2D(): Vector2D {
    return new Vector2D(this.x, this.y);
}
Run Code Online (Sandbox Code Playgroud)

我不知道这是否有所作为,但这里有一些背景知识:

  • 该应用程序是一个游戏循环运行的游戏(每秒60帧 - 使用window.requestAnimationFrame(() => this.animloop());)

  • 该应用在Chrome中正常运行

  • 它在IE中运行不正常(它看起来像一个不同的问题,但我还没有看到IE和调试工具在调查时崩溃)

  • 它使用最新的TypeScript(2.2.1)

  • 它似乎发生在启动后的一个随机点,有时是2秒,有时是3秒

  • 在代码中还有其他地方发生这种情况,所有这些都与PointVector2D在每一帧中创建它们有关(如果我引入一个字段而不是每帧创建一个字段,一些问题就会消失)

  • 我正在使用AMD和requirejs

更新-------

使用Edge和调试工具并设置"始终从服务器刷新",从网站(http://pacmanweb.azurewebsites.net/)加载时,我可以看到游戏尝试在加载所有模块之前运行.而在Chrome中,似乎在运行游戏之前等待加载所有内容.

有任何想法吗?

tos*_*skv 2

该应用程序对我来说失败了,因为看起来您正在使用转译代码中保留的默认参数值,如下所示:

  reset(isDemoMode = false) {
Run Code Online (Sandbox Code Playgroud)

Edge 似乎不支持此 ES6 功能,而 Chrome 很可能支持。

tsc 应该自动将其转译为 ES5。您应该检查您的配置,确保您没有将其设置为输出 es6 代码。

例如:

  reset(isDemoMode = false) {
Run Code Online (Sandbox Code Playgroud)

应该转译为:

function obj(x = 5) {  
}
Run Code Online (Sandbox Code Playgroud)

以及到游乐场的链接。