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