javascript - TypeError i Typescript


Här är mitt problem: jag får detta felmeddelande:

Oavbruten TypeError: Objektprototypen får endast vara ett Objekt eller 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));
                }
            }
        }
    }
}

Jag får detta fel på grund av raden innan de två kommenterade raderna:

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

Jag testade det genom att kommentera och avkommentera raderna, eftersom jag inte får något radnummer i felmeddelandet.

Vet någon vad jag kan göra? Om du behöver lite mer kod kan jag posta något...

Här är koden för LogicOr: https://pastebin.com/T28Zjbtb

Svar #1

För att lägga till detta, är det verkliga problemet här med det cirkulära beroendet att en av resurserna inte har laddats innan de används. Du kommer också att få detta fel om dina resurser laddas i fel ordning.

Tänk på detta exempel som använder gulp för att kompilera:

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

och gulp att kompilera

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

Utdatafilen app.bundle.js kommer att ge ett fel med "Uncaught TypeError: Object prototype may only be an Object or null: undefined" eftersom den resulterande koden först kommer att köra skapandet av Child-klassen (som har beroendet av Parent-klassen) innan föräldraklassen har laddats.

Om du tittar på den resulterande javascripten kommer du att få:

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

Och när du kör detta får du:

Okänt TypeError: Objektprototyp kan endast vara ett Objekt eller null: undefined vid setPrototypeOf()

För att åtgärda detta, ändra helt enkelt ordningen på resurserna i din gulp-fil eller vilken metod du än använder för att förbereda eller ladda JavaScript för sidan.

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

Det finns många sätt som detta kan hanteras på, detta är bara ett exempel för att hjälpa dig att förstå problemet och hur du kanske kan lösa det. Oavsett vilket sätt du hittar för att lösa problemet, i slutändan ber felet JavaScript-motorn att göra något som du ännu inte har gett instruktioner för vid tidpunkten för körningen.

Hoppas det här hjälper, Skål

Svar #2

Du får ett fel på den här raden:

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

Felmeddelandet är

Oavfångad TypeError: Objektprototyp får endast vara ett Objekt eller null: undefined

Det är mycket lätt att förstå när du är bekant med klasser och hur de fungerar (https://basarat.gitbooks.io/typescript/docs/classes.html).

Felet innebär att new LogicOr misslyckas eftersom LogicOr utökar något som är undefined. Enkel exempel:

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

Mer

Fixa buggen i LogicOr och dess arvkedja.

Relaterade artiklar