(Typescript)无法从非静态方法访问静态属性,反之亦然
我正在为我的NodeJS项目设计一个自定义模型结构。我已经创建了一个名为Model的基类,该基类由其他模型类继承。基本模型类将具有一组需要方法访问的属性。属性将被子类覆盖,如下面的示例所示(按用户模型) 有一个(Typescript)无法从非静态方法访问静态属性,反之亦然,typescript,inheritance,model,Typescript,Inheritance,Model,我正在为我的NodeJS项目设计一个自定义模型结构。我已经创建了一个名为Model的基类,该基类由其他模型类继承。基本模型类将具有一组需要方法访问的属性。属性将被子类覆盖,如下面的示例所示(按用户模型) 有一个表属性,我需要从静态和非静态方法访问该属性,例如: 案例1:基本模型类具有非静态属性表 类模型{ 受保护表=“”; 公共静态查找(id:编号){ //我想在这里有一个表名,但不能。 } 公共储蓄{ //我可以在这里得到表名“this”。 } } 类用户扩展模型{ 受保护的表='users'
表
属性,我需要从静态和非静态方法访问该属性,例如:
案例1:基本模型类具有非静态属性表
类模型{
受保护表=“”;
公共静态查找(id:编号){
//我想在这里有一个表名,但不能。
}
公共储蓄{
//我可以在这里得到表名“this”。
}
}
类用户扩展模型{
受保护的表='users';//覆盖父表属性
//此处列出了其他非静态属性
构造函数(用户:UserSchema){
//从此处指定非静态属性
}
}
案例2:基本模型类具有静态属性表
类模型{
受保护的静态表=“”;
公共静态查找(id:编号){
//我可以使用“this”在这里获取表名。
}
公共储蓄{
//我想在这里有一个表名,但不能。
}
}
类用户扩展模型{
受保护的静态表='users';//覆盖父表属性
//此处列出了其他非静态属性
构造函数(用户:UserSchema){
//从此处指定非静态属性
}
}
我尝试更改表
属性的静态和非静态性质,但每次切换时,都会出现两种情况
- 任一静态方法只能访问静态属性
- 或者非静态方法只能访问非静态属性
Model.table
)访问静态属性,但它将导致基本模型的空值(“”
),我需要用户的重载表值(“用户”)才能工作
我想控制两种情况,在这两种情况下,我可以交互地获取属性(从非静态方法访问静态属性,以及从非静态方法访问静态属性)。我怎样才能避免这种行为?感谢您的任何建议。关于案例1:
无法从静态上下文访问诸如表
之类的实例属性。您必须使表
成为一个静态受保护的静态表=''
,或者让find
成为一个实例方法public find(id:number){…}
关于案例2:
表
是一个静态类属性,将在用户
自身的构造函数上设置。它与模型
中的表
无关,因此无法通过用户
中的受保护的静态表='users'
覆盖它。您可以查看以了解类中如何实现静态
在模型
基类中,通过调用this.constructor.table
有一种(非类型化的)方法来创建。但我认为,您想要的是一个更干净的解决方案,即使表成为一个(可能的)实例属性,它提供来自父对象的子值:
class Model {
protected table = "";
public save() {
console.log(this.table)
}
}
class User extends Model {
protected table = 'users';
}
class Developer extends Model {
protected table = 'devs';
}
在案例2中,您可以通过模型从非静态访问静态。表保存。但是,如果手头没有实例,就不能在静态上下文中引用实例属性。@ford04是的,这就是我的问题所在facing@ford04我能够做到这一点,没有任何错误,但是在基类中没有收到从用户模型设置的tableusers
的值。它返回空字符串(这是属性的默认值)。我也希望在这里访问该值。与laravel framwork非常相似,在laravel framwork中,从子类中设置的表名可用于基础eloquent模型。好的,我知道了,但现在有一个公共静态查找()
函数,我需要在其中访问非静态属性表
。现在,在您提供的相同示例代码中,我可以做些什么来实现这种行为?(或者我只是在期待意外的结果)如前所述,这是不可能的——这就是JS和所有其他语言中OOP的工作方式。您必须重新考虑您的方法-例如,为什么它必须是静态的查找
,表
属性是否可以作为常量存储在模块中等。我在这里的回答中给了你们一些选择,现在我有一种轻微的感觉,那就是它更像是一种超越问题范围的架构设计。希望,尽管如此,它还是给了我一些灵感。我很感激。谢谢你抽出时间,不客气。如果还有什么问题没有解决,请随意提出一个新问题,重点是如何实现您的模型。祝你好运
new Developer().save() // "devs"
new User().save() // "users"