【问题标题】:Typescript: Static methods unable to access private properties in constructor打字稿:静态方法无法访问构造函数中的私有属性
【发布时间】:2026-01-01 19:20:03
【问题描述】:

试图让静态函数访问属性 xdate,该属性在构造函数中初始化(在 typescript 1.5.3 中)。

this.xdate 可以在所有其他实例方法中访问。 它在静态方法中仍然无法访问。

问。无论如何我可以在静态方法中使 this.xdate 可访问吗?

下面是我的代码:-

class vehicle{
  constructor(private xdate = new Date()){}

  vroom(){    console.log(this.xdate);  }
  static staticvroom(){ console.log(this.xdate);} //Warning: Property 'xdate' does not exist on type 'typeof vehicle'.


}//vehicle ends

let v1 = new vehicle;
v1.vroom(); //works

vehicle.staticvroom(); //undefined

/* this is how i executed it:- 
D:\js\Ang2\proj2\myforms\tsc_cRAP>tsc 7_.ts
7_.ts(18,42): error TS2339: Property 'xdate' does not exist on type 'typeof vehicle'.

D:\js\Ang2\proj2\myforms\tsc_cRAP>node 7_.js
2017-06-23T09:17:41.365Z
undefined

*/

任何指针都会有很大帮助。 (如果这是一个重复的问题,请提前道歉)

/* UglyHack#1:因为静态方法甚至在对象实例之前可用,所以我创建了一个 tmp obj。在 staticvroom(){} 中,它起作用了。

static staticvroom(){ 
  console.log((new vehicle).xdate); 
} 

不确定这方面的性能问题。

*/

【问题讨论】:

  • 你不能。由于静态成员内部的this 指的是类本身而不是类实例。
  • 我可以创建一个新的 obj。在静态方法中,然后使用 obj 变量访问它。这对我有用:`static staticvroom(){ let x = new vehicle;控制台.log(x.xdate); } `
  • 这是一个糟糕的设计,而且它非常容易出错。
  • 你能解释一下为什么它很可怕吗?我可以将对象设置为 null 并在 staticvroom() 中删除对它的所有引用。静态方法甚至在创建实例之前就可以访问;只是可能会使用该功能,我想。虽然我知道它很丑,但我没有看到任何性能问题。
  • 静态方法无法通过设计访问该类实例的任何非静态部分。似乎您不应该将该方法静态或不将 xdate 作为非静态字段。但是,除非您根据自己的主要意图改进您的问题,否则我们无法确定这一点。

标签: typescript constructor this static-methods


【解决方案1】:

您需要将实例作为参数传递

class Vehicle {
  constructor(private xdate = new Date()) {}
  vroom(){
    console.log(this.xdate);
  }
  static staticVar: Date = new Date();
  static staticvroom(vehicle: Vehicle) {
    console.log(vehicle.xdate);
    console.log(this.staticVar); // You can even access static vars with this
  }


}// vehicle ends

let v1 = new Vehicle;
v1.vroom(); // works

Vehicle.staticvroom(v1);

【讨论】: