Angular 在typescript类中初始化变量的参数化方法

Angular 在typescript类中初始化变量的参数化方法,angular,typescript,initialization,code-reuse,modularity,Angular,Typescript,Initialization,Code Reuse,Modularity,我的构造函数中有以下代码来初始化变量 public Elements: Observable<dcElementDataStoreItem>; private elementSubjectData: BehaviorSubject<dcElementDataStoreItem>; constructor() { this.elementSubjectData = new BehaviorSubject([]) as BehaviorSubject<Elemen

我的构造函数中有以下代码来初始化变量

public Elements: Observable<dcElementDataStoreItem>;
private elementSubjectData: BehaviorSubject<dcElementDataStoreItem>;

constructor() {
  this.elementSubjectData = new BehaviorSubject([]) as BehaviorSubject<ElementDataStoreItem>;
  this.Elements = this.elementSubjectData.asObservable();
}
现在只有两行了,我可能有两个类似的项目。 所以我可以做一些类似下面的代码,但这是行不通的

constructor() {
  this.initSubjectData<dcElementDataStoreItem>(this.elementSubjectData, this.Elements);
}

private initSubjectData<T>(privateList: BehaviorSubject<T>, publicList: Observable<T>) {
  privateList = new BehaviorSubject([]) as BehaviorSubject<T>;
  publicList = privateList.asObservable();
}

因此,我可以重用此initSubjectData来初始化所有其他可能的方法

您不能像在其他语言中那样通过引用传递字段,但您可以通过索引来传递字段名称。由于Typescript支持类型的概念,而该类型是另一种类型的键,因此这将是类型安全的

public elementSubjectData: BehaviorSubject<ElementDataStoreItem>;
public Elements: Observable<ElementDataStoreItem>;
constructor() {
    this.initSubjectData("elementSubjectData", "Elements");
}

private initSubjectData(privateListField: keyof this, publicListField:  keyof this) {
    let privateList =  new BehaviorSubject([]);
    this[privateListField] = new BehaviorSubject([]) as any;
    this[publicListField] = privateList.asObservable() as any;
}
interface Field<TName, TType> {
    name: string;
    set(value: TType) : void;
}
// In the class
constructor() {
    this.initSubjectData(this.field("elementSubjectData"), this.field("Elements"));
}
field<TKey extends keyof this>(name: TKey): Field<TKey, this[TKey]> {
    return {
        name,
        set: (value) => {
            this[name] = value
        }
    };
}
private initSubjectData<T>(privateListField: Field<keyof this, BehaviorSubject<T>>, publicListField:  Field<keyof this, Observable<T>>) {
    let privateList = new BehaviorSubject([]) as BehaviorSubject<T>;
    privateListField.set(privateList);
    publicListField.set(privateList.asObservable());
}