通过typescript中的this.constructor访问静态属性

时间:2015-10-28 09:29:09

标签: typescript this static-methods static-members typescript1.6

我想写es6类:

class SomeClass {
    static prop = 123

    method() {
    }
}

如何在不使用prop的情况下从method()访问静态SomeClass?在es6中可以使用this.constructor完成,但在typescript this.constructor.prop中会导致错误“ TS2339:属性'prop'在类型'Function'上不存在”。

6 个答案:

答案 0 :(得分:11)

  

但是在打字稿中,this.constructor.prop会导致错误" TS2339:Property' prop'类型'功能'"。

上不存在

Typescript不会将 while (true) { // Get a number from the user System.out.print("Enter an integer to find the factorial: "); int number = keyboard.nextInt(); if (Pattern.matches("\\d+", String.valueOf(number))) { if (Integer.valueOf(number) == 0) System.exit(0); // Display the factorial System.out.println(number + "! is " + factorial(number)); } else System.out.println("Error"); } 的类型推断为constructor之外的任何内容(毕竟......构造函数可能是一个子类)。

所以使用断言:

Function

More on assertions

答案 1 :(得分:3)

微软程序员谈论这个,但没有一个好方法来输入constructor。您可以先使用此提示。

class SomeClass {
    /**
     * @see https://github.com/Microsoft/TypeScript/issues/3841#issuecomment-337560146
     */
    ['constructor']: typeof SomeClass

    static prop = 123

    method() {
        this.constructor.prop // number
    }
}

答案 2 :(得分:0)

它有点脏,但这段代码适用于我Typescript Playground

class SomeClass {
    static prop = 123;

    constructor() {
        console.log(this.constructor["prop"]);
    }

}

var a = new SomeClass();

答案 3 :(得分:0)

通常简单的方法是:

class SomeClass {
    static prop = 123

    method() {
        console.log(SomeClass.prop)  //> 123
    }
}

请注意,如果您使用此功能,SomeClass的子类将直接访问SomeClass.prop而不是SomeSubClass.prop。如果希望子类访问自己的同名静态属性,请使用basarat的方法。

答案 4 :(得分:0)

通过this.constructor访问静态属性(而不是像通常那样仅使用SomeClass.prop)仅在不知道类名且必须使用{{1 }}。 this不起作用,所以这是我的解决方法:

typeof this

或者,在课外使用时:

class SomeClass {

  static prop = 123;

  method() {

    const that = this;

    type Type = {
      constructor: Type;
      prop: number; //only need to define the static props you're going to need
    } & typeof that;

    (this as Type).constructor.prop;
  }

}

答案 5 :(得分:0)

我想您将来希望扩展此类。所以最好这样做:

class SomeClass<T extends typeof SomeClass = typeof SomeClass> {
    static prop = 123

    method() {
        (this.constructor as T).prop;
    }
}