Angular typescript 在实现 subclasses 来抽象 class 时给出引用错误
Angular typescript gives reference error when implementing subclasses to abstract class
我得到当前错误:
Uncaught ReferenceError: can't access lexical declaration 'AbstractClass' before initialization
在新的 Angular 项目中执行此操作时:
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = '';
ngOnInit() {
console.log(JSON.stringify(new (AbstractClass.get("MyId1"))()))
}
}
而且我不明白为什么会发生这种情况,因为我首先引用了一个静态方法,然后实例化了函数返回的 class 引用,然后在新初始化的 class 上调用了一个函数。 .
AbstractClass.ts
export abstract class AbstractClass {
abstract getModelName(): string;
public static get(id: string): Type<AbstractClass> {
switch (id) {
case "MyId1":
return MyId1ImplementationClass;
case "MyId2":
return MyId2ImplementationClass;
default:
return MyId1ImplementationClass;
}
}
}
MyId1ImplementationClass.ts
export class MyId1ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id1!";
}
}
MyId2ImplementationClass.ts
export class MyId2ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id2!";
}
}
你这里有一个循环依赖,这几乎可以肯定是错误的原因。您的实现 classes 依赖于抽象 class 但抽象 class 也直接依赖于实现。
修复了必须打破循环依赖的问题。一种常见的方法是使用注册表。这是一种模式,其中实现将自己添加到映射或列表中,然后静态函数可以访问它们。
类似于:
export abstract class AbstractClass {
abstract getModelName(): string;
protected static registry = new Map<string, Type<AbstractClass>>()
public static register () {
this.registry.set(this.prototype.getModelName.call(null), this as any)
}
public static get(id: string): Type<AbstractClass> {
return this.registry.get(id)
}
}
export class MyId1ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id1!";
}
}
MyId1ImplementationClass.register()
我得到当前错误:
Uncaught ReferenceError: can't access lexical declaration 'AbstractClass' before initialization
在新的 Angular 项目中执行此操作时:
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {
title = '';
ngOnInit() {
console.log(JSON.stringify(new (AbstractClass.get("MyId1"))()))
}
}
而且我不明白为什么会发生这种情况,因为我首先引用了一个静态方法,然后实例化了函数返回的 class 引用,然后在新初始化的 class 上调用了一个函数。 .
AbstractClass.ts
export abstract class AbstractClass {
abstract getModelName(): string;
public static get(id: string): Type<AbstractClass> {
switch (id) {
case "MyId1":
return MyId1ImplementationClass;
case "MyId2":
return MyId2ImplementationClass;
default:
return MyId1ImplementationClass;
}
}
}
MyId1ImplementationClass.ts
export class MyId1ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id1!";
}
}
MyId2ImplementationClass.ts
export class MyId2ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id2!";
}
}
你这里有一个循环依赖,这几乎可以肯定是错误的原因。您的实现 classes 依赖于抽象 class 但抽象 class 也直接依赖于实现。
修复了必须打破循环依赖的问题。一种常见的方法是使用注册表。这是一种模式,其中实现将自己添加到映射或列表中,然后静态函数可以访问它们。
类似于:
export abstract class AbstractClass {
abstract getModelName(): string;
protected static registry = new Map<string, Type<AbstractClass>>()
public static register () {
this.registry.set(this.prototype.getModelName.call(null), this as any)
}
public static get(id: string): Type<AbstractClass> {
return this.registry.get(id)
}
}
export class MyId1ImplementationClass extends AbstractClass {
getModelName(): string {
return "Id1!";
}
}
MyId1ImplementationClass.register()