typescript - 打字稿:在具有作为类一部分的参数的类上创建方法
问题描述
我创建了一个类,并希望将重复的逻辑提取到该类的方法中,以供该类的其他属性重用。
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 方法定义字段参数的类型,因为字段的值会因字段而异,但共同因素是该字段将是类的一部分。
解决方案
我相信这就是您正在寻找的。
关键
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');
推荐阅读
- vue.js - vue和vuex购物车数量更新问题?
- windows - 虚幻:诊断 Windows 无法加载 DLL 的原因
- php - 如何显示来自 sqlite db 和动画的最新数据以查看更多信息?
- reactjs - React Select 选择后保留输入值
- swift - Swift 5 中的自定义 TEST 预处理器宏
- phabricator - 是否有 API 可以获取差异修订的审核状态?
- reactjs - 在 React 组件中使用 document.getElementById() 是否可以接受?
- javascript - 如何按值比较两个表
- kql - 如何在操作员日期时间变量之间调用
- verilog - “分配”操作中的操作优先级?