Доступ к статическим членам из функции конструктора - PullRequest
1 голос
/ 10 июня 2019

У меня проблема с доступом к статическим членам из экземпляра конструктора класса.Код работает, но информация о типе неверна.

var ctor: { new (...args: any[]): Foo } = undefined as any;

function decorator() {
    return function <T extends { new (...args: any[]): Foo }>(constructor: T) {
        ctor = constructor;
        return constructor;
    }
}

@decorator()
class Foo {
    static Func = () => console.log("Hi");
}

Foo.Func();
ctor.Func();
Foo.prototype.constructor.Func();

В приведенном выше примере вызов Foo.Func в порядке.Второй звонок говорит мне, что нет Func участника.Третий вариант должен быть в основном таким же, как и второй, но поскольку prototye имеет тип any, информация о типе теряется.

Есть ли способ правильно набрать ctor, чтобыстатические члены можно увидеть на нем?

1 Ответ

1 голос
/ 10 июня 2019

Вы можете использовать tyepof Foo для получения фактического типа класса (не экземпляра). Это будет содержать любые статические методы:

var ctor: typeof Foo = undefined as any;

function decorator() {
    return function <T extends typeof Foo>(constructor: T) {
        ctor = constructor;
        return constructor;
    }
}

@decorator()
class Foo {
    static Func = () => console.log("Hi");
}

Foo.Func();
ctor.Func();

Более общий подход, который не привязывает вас к определенному классу, заключается в добавлении методов к сигнатуре конструктора:

interface DecoratableClass {
    new (...a: any[]) : any // replace any with an interface as needed
    Func: ()=> void
}
var ctor: DecoratableClass= undefined as any;

function decorator() {
    return function <T extends DecoratableClass>(constructor: T) {
        ctor = constructor;
        return constructor;
    }
}

@decorator()
class Foo {
    static Func = () => console.log("Hi");
}

@decorator() // error no Func
class BadFoo {
    static NoFunc = () => console.log("Hi");
}

Foo.Func();
ctor.Func();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...