【问题标题】:typescript typing with static member of class使用类的静态成员打字打字
【发布时间】:2019-09-30 12:21:33
【问题描述】:

我想通过这个类的一个对象来访问一个类的静态成员。

我使用obj.constructor 进行操作。它工作得很好,除了打字稿 linter 说

“函数”类型上不存在属性“getName”

class Foo {
    public static getName(): string {
        return 'foo';
    }
}

const foo = new Foo();

const name: string = foo.constructor.getName();

我尝试使用:const name: string = (foo.constructor as Foo).getName();

但它给了我

属性“getName”是“Foo”类型的静态成员


编辑

它使用:const name: string = (foo.constructor as typeof Foo).getName();

有没有什么方法可以在不手动转换类的情况下工作?



INFO : 在我的具体情况下,我不能直接使用 Foo.getName() 调用它

【问题讨论】:

    标签: typescript class typescript-typings


    【解决方案1】:

    通过直接调用构造函数来访问静态方法:

    Foo.getName()
    

    如果由于某种原因您无权访问构造函数,则将 foo.constructor 断言为它的类型。

    const name: string = (foo.constructor as typeof Foo).getName();
    

    【讨论】:

    • 感谢您的输入,但我特别要求不要使用类名直接调用它。我想要一个与foo.constructor 一起工作的解决方案。
    • 我在点击提交后就看到了你的提示。我编辑了我的答案。
    • 这个问题是,如果 OP 有权访问 Foo 以提供给 typeof 那么他可以调用Foo.getName()
    • @JaredSmith 完全明白了。如果答案是:不可能。好的,但请以这种方式发布答案。
    【解决方案2】:

    如果您无权访问该类,则必须使用编译器对其进行修改。请注意,这是一个肮脏肮脏的黑客,但有时你只需要告诉编译器“闭嘴,我知道我在做什么”。

    class Foo {
      public static getName() {
        return 'foo';
      }
    }
    
    const foo = new Foo();
    
    interface FudgeIt {
      getName: () => string,
    }
    
    // compiler won't let us cast a function to
    // a random interface without declaring it
    // unknown first.
    const c: unknown = foo.constructor;
    (c as FudgeIt).getName();
    

    这是相关playground的链接

    【讨论】:

    • 我明白了,所以没有办法隐含地说打字稿.constructortypeof Foo 好吗?也没有其他方法可以访问对象的静态方法(不同于.constructor)?如果是这样,我想我现在就选择// @ts-ignore。谢谢你的把戏,它可能会帮助别人
    • @GrégoryNEUT 拥有像 Javascript 这样极其灵活的基础语言的部分问题在于,类型检查器必须对可以或不能从其下更改的内容非常悲观。您可以随意使用或不使用该技巧,但如果您最终使用它,我会包含一些解释性 cmets。
    • 我完全同意。我们正在将所有代码从 javascript 转移到 typescript,所以我们遇到了这些问题。谢谢你的帮助。我们稍后将对其进行重构,以便能够访问该类型 (Foo) 并正确使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 2016-06-13
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多