(Typescript)无法从非静态方法访问静态属性,反之亦然

(Typescript)无法从非静态方法访问静态属性,反之亦然,typescript,inheritance,model,Typescript,Inheritance,Model,我正在为我的NodeJS项目设计一个自定义模型结构。我已经创建了一个名为Model的基类,该基类由其他模型类继承。基本模型类将具有一组需要方法访问的属性。属性将被子类覆盖,如下面的示例所示(按用户模型) 有一个表属性,我需要从静态和非静态方法访问该属性,例如: 案例1:基本模型类具有非静态属性表 类模型{ 受保护表=“”; 公共静态查找(id:编号){ //我想在这里有一个表名,但不能。 } 公共储蓄{ //我可以在这里得到表名“this”。 } } 类用户扩展模型{ 受保护的表='users'

我正在为我的NodeJS项目设计一个自定义模型结构。我已经创建了一个名为Model的基类,该基类由其他模型类继承。基本模型类将具有一组需要方法访问的属性。属性将被子类覆盖,如下面的示例所示(按用户模型)

有一个
属性,我需要从静态和非静态方法访问该属性,例如:

案例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我能够做到这一点,没有任何错误,但是在基类中没有收到从用户模型设置的table
users
的值。它返回空字符串(这是属性的默认值)。我也希望在这里访问该值。与laravel framwork非常相似,在laravel framwork中,从子类中设置的表名可用于基础eloquent模型。好的,我知道了,但现在有一个
公共静态查找()
函数,我需要在其中访问非静态属性
。现在,在您提供的相同示例代码中,我可以做些什么来实现这种行为?(或者我只是在期待意外的结果)如前所述,这是不可能的——这就是JS和所有其他语言中OOP的工作方式。您必须重新考虑您的方法-例如,为什么它必须是静态的
查找
属性是否可以作为常量存储在模块中等。我在这里的回答中给了你们一些选择,现在我有一种轻微的感觉,那就是它更像是一种超越问题范围的架构设计。希望,尽管如此,它还是给了我一些灵感。我很感激。谢谢你抽出时间,不客气。如果还有什么问题没有解决,请随意提出一个新问题,重点是如何实现您的模型。祝你好运
new Developer().save() // "devs"
new User().save() // "users"