Typescript 中的 TypeError
这是我的问题: 我收到此错误:
Uncaught TypeError: Object prototype may only be an Object or 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
此外,循环依赖的实际问题是由于某个资源在使用前尚未加载。如果您的资源加载顺序错误,您也会收到此错误。
考虑这个使用 gulp 编译的示例:
// File Parent.ts
export class Parent {
public prop: string = "prop";
}
//File Child.ts
export class Child extends Parent {
public prop2: string = "prop2";
}
和 gulp 编译
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 将出现错误“Uncaught TypeError: Object Prototype may only be an Object or null: undefined”,因为生成的代码将首先执行 Child 类的创建(该类依赖于 Parent 类),然后再加载父类。
如果您查看生成的 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;
}());
并且当您运行此代码时,您将获得:
Uncaught TypeError: Object Prototype may only be an Object or null: undefined at setPrototypeOf ()
要解决此问题,只需更改 gulp 文件中资源的顺序或您用于准备或加载 javascript 的任何方法即可页面。
return gulp.src(['code/Parent.js', 'code/Child.js'])
有很多方法可以解决这个问题,这只是一个例子,帮助您了解问题以及如何修复它。无论您找到哪种方法来解决问题,最终,错误都是要求 javascript 引擎执行您在执行时尚未给出指示的操作。
希望这有帮助, 干杯
您在此行收到错误:
actualLogicExpression.logicChildExpressions[0] = new LogicOr();
错误消息为
Uncaught TypeError: Object prototype may only be an Object or null: undefined
一旦您熟悉了类及其工作原理( https://basarat.gitbooks.io/typescript/docs/classes.html ),就很容易理解。
该错误意味着
new LogicOr
失败,因为
LogicOr
正在扩展
未定义
的内容。简单示例:
let Bar;
class Foo extends Bar { } // Uncaught TypeError: Object prototype may only be an Object or null: undefined
更多
修复
LogicOr
及其继承链中的错误。
对于那些不幸不得不使用 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'
进行这些更改足以为我解决问题。