1

我得到当前的错误:

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

而且我不明白为什么会发生这种情况,因为我首先引用了一个静态方法,然后实例化函数返回的类引用,然后在新初始化的类上调用一个函数......

抽象类.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!";
    }
}
4

1 回答 1

1

您在这里有一个循环依赖,这几乎可以肯定是错误的原因。您的实现类依赖于抽象类,但抽象类也直接依赖于实现。

解决你必须打破循环依赖的问题。一种常见的方法是使用注册表。这是一种模式,其中实现将自己添加到地图或列表中,然后静态函数可以访问它们。

就像是:

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()
于 2021-09-16T09:32:53.413 回答