Доступ к статическим свойствам через this.constructor в typescript

Я хочу написать класс es6:

class SomeClass {
    static prop = 123

    method() {
    }
}

Как получить доступ к статическому prop из method() без использования SomeClass явно? В es6 это можно сделать с помощью this.constructor, но в typescript this.constructor.prop возникает ошибка "TS2339: свойство 'prop' не существует в типе 'Function'".

Ответ 1

но в машинописном тексте this.constructor.prop вызывает ошибку "TS2339: свойство" prop "не существует для типа" Function "".

Typescript не подразумевает, что тип constructor должен выходить за пределы Function (в конце концов... конструктор может быть подклассом).

Так что используйте утверждение:

class SomeClass {
    static prop = 123;
    method() {
        (this.constructor as typeof SomeClass).prop;
    }
}

Подробнее об утверждениях

Ответ 2

Microsoft программист говорит об этом, но нет хорошего способа набрать constructor. Вы можете использовать этот совет первым.

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

    static prop = 123

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

Ответ 3

Это немного грязно, но этот код работает для меня на Typescript Игровая площадка:

class SomeClass {
    static prop = 123;

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

}

var a = new SomeClass();

Ответ 4

Обычно простой способ:

class SomeClass {
    static prop = 123

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

Обратите внимание: если вы используете это, подклассы SomeClass будут обращаться к SomeClass.prop напрямую, а не к SomeSubClass.prop. Используйте метод basarat, если вы хотите, чтобы подклассы имели доступ к своим статическим свойствам с тем же именем.

Ответ 5

Доступ к статическим свойствам с помощью this.constructor (в отличие от SomeClass.prop выполнения SomeClass.prop как обычно), будет полезен только тогда, когда вы не знаете имя класса и должны использовать 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;
  }

}

Или, когда используете его вне класса:

class SomeClass {
  static prop = 123;
  method() {
    console.log(
      getPropFromAnyClass(this)
    );
  }
}

function getPropFromAnyClass<T>(target: T) {
  type Type = {
    constructor: Type;
    prop: number; //only need to define the static props you're going to need
  } & T;

  return (target as Type).constructor.prop;
}

Ответ 6

Я предполагаю, что вы хотите в будущем расширить этот класс. Так что лучше сделать это:

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

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