【发布时间】:2019-07-14 15:32:06
【问题描述】:
我有一个类型,我想以某种方式分配给一个类,以便该类具有与所述类型相同的属性。
abstract class Model<T> {
protected options: T
constructor (options?: Partial<T>) {
this.options = { ...this.fake(), ...options }
}
abstract fake () : T
}
type UserOptions = {
userName: string,
email: string,
roles?: int[]
}
class User extends Model<UserOption> {
fake () : UserOption {
return {
userName: getRandomUsername(),
email: getRandomEmail()
}
}
}
有了这个,我可以创建新模型并实例化它们,而无需填写所有字段。任何未指定的字段仅填充随机数据。但是现在我也想直接访问这些字段,例如通过(new User()).userName。现在我可以公开options 并通过.options.userName 访问这些字段,但是当我需要在很多地方访问它们时,这将变得非常冗长。
有没有一种方法可以在正确键入实例的同时将所有这些属性通用分配给实例本身?
另外,我正在考虑使用代理并在其他辅助方法中返回它们,而不是模型本身。这样,为了获得代理,仍然必须调用一个方法,但我的其余代码将始终直接返回代理。我在abstract class Model<T> 中对此进行了尝试,但它没有为user.proxy() 的调用者提供任何关于属性“存在”的知识(显然,因为返回类型只是this)。
proxy () : this {
return new Proxy(this, {
get (target, prop: keyof T, receiver) {
return target.options[prop]
}
})
}
【问题讨论】:
标签: typescript