【问题标题】:Access static members from constructor function从构造函数访问静态成员
【发布时间】:2019-06-10 12:34:29
【问题描述】:

我在从类构造函数实例访问静态成员时遇到问题。代码有效,但类型信息错误。

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 has 是any 类型,所以类型信息丢失了。

有没有办法正确输入ctor,以便在上面看到静态成员?

【问题讨论】:

    标签: typescript types constructor static


    【解决方案1】:

    您可以使用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();
    

    【讨论】:

    • 这个解决方案在操场上运行良好,但是当我在我的项目中实现它时,所有的静态成员在构造函数实例上都是undefined。知道为什么会这样吗?它与构建过程有关吗?
    • @MarošBeťko 应该可以工作,你使用 typescript 还是 babel 进行编译?
    • 我正在使用 babel
    • 另外,当我 console.log 保存的 ctor 时,它会记录一个带有 elements 属性的 Descriptor 对象,而在操场上它看起来不同。
    • @MarošBeťko 不确定如何在 babel 中调用装饰器。我相信调用的顺序是不同的
    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 2017-04-04
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多