【发布时间】:2020-05-21 03:54:10
【问题描述】:
我有一个有多个子类的类,它几乎是一个神奇的类,并且做了一些逻辑来帮助我与 json api 集成。
这个例子中的类被称为Resource,这个类的工作就是能够像使用 Laravel 模型一样使用它。所以我扩展了这个类,方法显然可以从那个类中使用,但是我在子类上有了变异器和其他逻辑,举这个例子。
class Resource {
constructor(attributes: Attributes) {
const keys: string[] = Object.keys(attributes);
keys.forEach((attributeKey: string) => {
this.setAttribute(attributeKey, attributes[attributeKey]);
Object.defineProperty(this, attributeKey, {
get: () => this.getAttribute(attributeKey),
set: (value: any) => this.setAttribute(attributeKey, value);
});
});
}
...
}
class User extends Resource {
setFirstNameAttribute(value: string): void {
this.attributes.firstName = value.toUpperCase();
}
}
这会将类的 firstName 属性转换为全大写,这是由 Resource 类的构造函数中定义的 getter 和 setter 完成的。
这一切都很完美,例如......
const user = new User({ firstName: 'John', lastName: 'Doe' });
console.log(user.firstName);
实际上会输出JOHN,因此父类内部的所有逻辑都可以正常工作。
我发现自己遇到的唯一问题是类型,因为属性实际上是动态设置的,我似乎无法找到获取这种类型的方法,因为我希望类上的方法被类型提示所以@ 987654327@ 不会出错,user.firstName 也不会出错,但因为 firstName 不是实际属性,我无法找到提示的方法。
我尝试设置类似class Resource<T> 的内容,但我不确定我是否完全理解这一点。
【问题讨论】:
-
const user:User = new User(....)怎么样?您的用户类是什么样的?您是否公开了您的成员? -
@Joel 我不敢相信我从来没有真正想过这个。你是说做类似...
class User extends Resource { firstName!: string; lastName!: string } -
@tallent123 该解决方案也可以正常工作。然后,您可以从类中提取字段以获得正确类型的构造函数..
标签: typescript types