Typescript中的TypeError

时间:2017-06-07 20:03:10

标签: javascript typescript

这是我的问题: 我收到这个错误:

  

未捕获的TypeError:对象原型可能只是一个Object或null:undefined

export abstract class AbstractLogicExpression {
    protected _logicChildExpressions: AbstractLogicExpression[] = Array();
    protected _precedence = 0;
    protected _parsed = false;
    protected _expressionType = "";

    protected rightAssociative = false;

    public toDNF() {
        for (let i = 0; i < this.logicChildExpressions.length; i++) {
            let actualLogicExpression: AbstractLogicExpression = this.logicChildExpressions[i];

            if (actualLogicExpression._expressionType == "~") {

                let logicConjunction = actualLogicExpression.logicChildExpressions[0];

                let var1 = logicConjunction.logicChildExpressions[0];
                let var2 = logicConjunction.logicChildExpressions[1];

                if (logicConjunction._expressionType == "*") {
                    actualLogicExpression.logicChildExpressions[0] = new LogicOr();
                    //actualLogicExpression.logicChildExpressions[0].add(new LogicNeg(var1));
                    //actualLogicExpression.logicChildExpressions[0].add(new LogicNeg(var2));
                }
            }
        }
    }
}

由于两条注释行之前的行,我收到此错误:

actualLogicExpression.logicChildExpressions[0] = new LogicOr();

我通过评论测试了它并取消注释了这些行,因为我在错误消息中没有得到行号。

有人知道我能做什么吗? 如果您需要更多代码。我可以张贴一些东西......

这里是LogicOr的代码: https://pastebin.com/T28Zjbtb

3 个答案:

答案 0 :(得分:14)

你在这一行收到错误:

  

actualLogicExpression.logicChildExpressions [0] = new LogicOr();

错误消息是

  

未捕获的TypeError:对象原型可能只是一个Object或null:undefined

熟悉课程及其工作原理(https://basarat.gitbooks.io/typescript/docs/classes.html)后,您就会很容易理解。

错误表示new LogicOr失败,因为LogicOr正在扩展undefined。简单的例子:

let Bar; 
class Foo extends Bar { } // Uncaught TypeError: Object prototype may only be an Object or null: undefined

更多

修复LogicOr及其继承链中的错误。

答案 1 :(得分:12)

此外,循环依赖的实际问题是因为其中一种资源在使用之前尚未加载。如果您的资源加载不正常,也会出现此错误。

考虑使用gulp进行编译的示例:

// File Parent.ts
export class Parent {
    public prop: string = "prop";
}
//File Child.ts
export class Child extends Parent {
    public prop2: string = "prop2";
}

和要编译的数据包

gulp.task('compile-js', function () {
return gulp.src(['code/Child.js', 'code/Parent.js'])
    .pipe(sourcemaps.init())
    .pipe(concat('app.bundle.js'))
    .pipe(sourcemaps.write())
    .pipe(gulp.dest('app/build'));
});

输出文件app.bundle.js将因“未捕获的TypeError:对象原型只能是Object或null:未定义”而出错,因为生成的代码将首先执行Child类的创建(该类依赖于父类)加载之前。

如果查看生成的javascript,将会得到:

var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var Child = /** @class */ (function (_super) {
    __extends(Child, _super);
    function Child() {
        var _this = _super !== null && _super.apply(this, arguments) || this;
        _this.prop2 = "prop2";
        return _this;
    }
    return Child;
}(Parent));
var Parent = /** @class */ (function () {
    function Parent() {
        this.prop = "prop";
    }
    return Parent;
}());

当您运行它时,您将获得:

未捕获的TypeError:对象原型只能是Object或为null:未定义     在setPrototypeOf()

要解决此问题,只需更改gulp文件中资源的顺序或使用任何用于准备或加载页面javascript的方法即可。

return gulp.src(['code/Parent.js', 'code/Child.js'])

有许多方法可以解决,这只是一个示例,可以帮助您理解问题以及如何解决。最后,无论您采用哪种方法解决问题,错误都是要求javascript引擎执行在执行时尚未给出指令的操作。

希望这会有所帮助, 干杯

答案 2 :(得分:0)

对于那些不幸不得不使用 Javascript 的绝望灵魂来说,这可能对您有所帮助:对我来说修复它的是创建一个 index.ts 类,以正确的顺序导出类,然后使我从索引文件而不是从相对路径导入的所有内容。这是文件的样子:

export { default as BasePage } from './BasePage' // abstract class
export { default as ProtectedAppPage } from './ProtectedAppPage' // abstract extending BasePage class
export { default as RegistrationForm } from './registration/forms/RegistrationForm' // abstract class extending ProtectedAppPage

export { default as ForgotPasswordPage } from './authentication/ForgotPasswordPage' // concrete class extending BasePage
export { default as HomeAddressForm } from './registration/forms/HomeAddressForm' // concrete class extending RegistrationForm
export { default as MfaPage } from './authentication/MfaPage' // concrete class extending ProtectedAppPage

现在让我们看看导入。

// before
import HomeAddressForm from './registration/forms/HomeAddressForm'
// after
import HomeAddressForm from './index'

进行这些更改足以为我解决问题。