我对Typescript静态功能有疑问

时间:2019-05-11 17:25:44

标签: typescript

这是我的代码。

class BaseClass {
   // some static method
   static someMethod() {
   }
}
class ChildClass extends BaseClass{

}
class AnotherClass {
   protected variable: BaseClass; // It works while the type is any

   protected someFunction() {
      return this.variable.someMethod(); // Editor shows that there's no someMethod in BaseClass
   }
}

问题是,我希望AnotherClass中的受保护变量存储类函数,而不是类实例。

有可能吗?

谢谢。

对不起,我的英语不好。

2 个答案:

答案 0 :(得分:0)

在您的示例中,variable属性是BaseClass的实例,而不是类本身。

variable的类型必须是BaseClass的类型,即typeof BaseClass

class AnotherClass {
  protected variable: typeof BaseClass;

  public constructor(v: typeof BaseClass) {
    this.variable = v;
  }

  protected someFunction() {
    return this.variable.someMethod();
  }
}


const a: AnotherClass = new AnotherClass(BaseClass);

答案 1 :(得分:0)

此错误是由tsc而非编辑器引起的。

指出代码中的一些问题。

class AnotherClass {
    protected variable: BaseClass; // This is mean variable is instance of BaseClass
    protected someFunction() {
        return this.variable.someMethod(); // So you cannot access a static method of an instance
    }
}

如果要访问类的静态方法。您应该从类对象而不是类的实例调用。因此,您应该将变量成员的类型从BaseClass修改为typeof BaseClass
以下是一个简单的示例。为了简化概念,我修改了成员的封装。

class BaseClass {
  static someMethod(): void {}
}

class DeriveClass extends BaseClass {
}

class AnotherClass {
    public variable: typeof BaseClass = BaseClass;
    public someFunction() {
        return this.variable.someMethod();
    }
}

let instance = new AnotherClass();
instance.variable = DeriveClass; // This is accepted, because DeriveClass extended from BaseClass
instance.someFunction();