首页 > 解决方案 > 打字稿:在具有作为类一部分的参数的类上创建方法

问题描述

我创建了一个类,并希望将重复的逻辑提取到该类的方法中,以供该类的其他属性重用。

class Card {
  protected readonly data: Data;
  protected readonly user: User;
  nameVal: string;
  addressVal: string[];

  constructor(raw_data: Data, user: User) {
    this.data = raw_data;
    this.user = user;
  }

  get name(): string {
    if (!this.nameVal) {
      this.nameVal = name_getter(this.data, this.user); // same parameters
    }
    return this.nameVal;
  }

  get address(): string[] {
    if (!this.addressVal) {
      this.addressVal = address_getter(this.data, this.user); // same parameters
    }
    return this.addressVal;
  }

  // I want to refactor the above logic and have it handled in a function like below
  // maybe getter type would be something like this: 
  // type FieldValueGetter = (data: Data, user: User) => any;
  getFieldValue(getter: FieldValueGetter, field: ?) { // Is there a way to define field type? 
    if(!field) {
      this.field = getter(this.data, this.user);
    }
    return this.field;
  }
}

我不确定如何为 getFieldValue 方法定义字段参数的类型,因为字段的值会因字段而异,但共同因素是该字段将是类的一部分。

标签: typescript

解决方案


我相信这就是您正在寻找的。

关键

function getter(data:Data, user:User, field: string){
// your logic here.
}
class Card {
    protected readonly data: Data;
    protected readonly user: User;

    field: string = '';
    field2: number = 0;

    constructor(raw_data: Data, user: User) {
        this.data = raw_data;
        this.user = user;
    }

    getFieldValue<T>(getter: FieldValueGetter, field: keyof this): T {
        if (!field) {
            this[field] = getter(this.data, this.user, field);
        }
        return this[field] as any as  T;
    }
}

const card = new Card({}, {});
card.getFieldValue<string>(getter, 'field');
card.getFieldValue<number>(getter, 'field2');

推荐阅读