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

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

class SomeClass {
    static prop = 123

    method() {
    }
}

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


person Artur Eshenbrener    schedule 28.10.2015    source источник
comment
Вы пробовали «this.constructor[prop]»?   -  person TSV    schedule 28.10.2015
comment
Это не решение: в этом случае у меня полностью отсутствует проверка типа. Я хочу получить ошибку при доступе к несуществующему свойству.   -  person Artur Eshenbrener    schedule 28.10.2015
comment
Можете ли вы поделиться своим фактическим кодом? В каком контексте вы пытаетесь это сделать?   -  person TSV    schedule 28.10.2015
comment
@ArturEshenbrener, ты мог бы сделать (this.constructor as typeof SomeClass).prop, но какой в ​​этом смысл? Почему бы не сделать SomeClass.prop?   -  person David Sherret    schedule 28.10.2015


Ответы (5)


но в машинописном тексте this.constructor.prop вызывает ошибку «TS2339: свойство« реквизит »не существует для типа« функция »».

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

Поэтому используйте утверждение:

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

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

person basarat    schedule 29.10.2015

Программист 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
    }
}
person colder    schedule 20.03.2018

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

class SomeClass {
    static prop = 123

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

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

person pixelpax    schedule 13.07.2017
comment
В вопросе указано без использования SomeClass явно. Я смущен тем, как это дает ответ. - person Lazar Ljubenović; 19.02.2020

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

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

    method() {
        (this.constructor as T).prop;
    }
}
person ktretyak    schedule 13.04.2019

Доступ к статическим свойствам через this.constructor (в отличие от простого выполнения 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;
}
person Okku    schedule 15.08.2018