【问题标题】:typescript, access static member打字稿,访问静态成员
【发布时间】:2016-12-28 10:40:14
【问题描述】:

我想要这样的东西 - Api.drinks.info -> 它是静态的并返回字符串。但是我有一个错误

module App {
export class Api {
    public static drink: Drink;
}

class Drink {
    static get base(): string { return '/api/drink'; }
    public static get info(): string { return `${Drink.base}/info`; }
}}

我该如何解决或实施?谢谢。

更新


一种可能的解决方案

module Api {
export module Drink {
    var base = '/api/drink';
    export var info = `${base}/info`;
}
export module Admin {
    var base = '/api/drink';
    export var info = `${base}/info`;
}}

【问题讨论】:

    标签: javascript typescript static


    【解决方案1】:

    Api.drink 不是Drink,类(构造函数),这就是info;它是Drink实例,但它不是。试图访问它的行试图像使用类一样使用实例。

    你不导出Drink,所以访问它的唯一方法是真的迂回:

    this.resource = this.dataAccessService.getResource(Api.drink.constructor.info);
    

    ...不过最好导出Drink直接使用:

    this.resource = this.dataAccessService.getResource(Drink.info);
    

    请注意,引用的代码永远不会为 drink 实例分配值,因此您需要使用上述任何一种方法来执行此操作。


    或者,也许您打算将构造函数Drink 公开为Api 的静态成员?如果是这样,您需要稍微改变一下,请参阅 cmets:

    module App {
        // Classes aren't hoisted, so this needs to be before Api
        class Drink {
            static get base(): string { return '/api/drink'; }
            public static get info(): string { return `${Drink.base}/info`; }
        }
    
        export class Api {
            // 1. It's a function
            // 2. We're initializing it to Drink
            // 3. Because it's a constructor function / class, we use an
            //    initial capital letter in its name
            public static Drink: Function = Drink;
        }
    }
    

    然后:

    this.resource = this.dataAccessService.getResource(Api.Drink.info);
    

    【讨论】:

    • 这不是一种方法,而是一种属性。所以我可以在没有 () 的情况下访问它。
    • 我找到了如何通过模块实现它,module Api { export module Drink { var base = '/api/drink';导出变量信息 = ${base}/info; } 导出模块管理员 { var base = '/api/drink';导出变量信息 = ${base}/info; } }
    • @ovasylenko:是的,这就是我的意思“但最好导出Drink并直接使用它:”(对不起,错过了getinfo。)
    • @t-j-crowder 谢谢你的帮助!
    • @ovasylenko:我想你的意思是export class,顺便说一句。如果这回答了您的问题,那么 SO 的工作方式,您可以通过单击它旁边的复选标记来接受答案,这会将其从未回答的问题列表中删除。
    猜你喜欢
    • 2014-04-26
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多