Доступ к статическим свойствам через 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;
}
}