【问题标题】:Do private properties and methods belong inside a TypeScript definition file?私有属性和方法是否属于 TypeScript 定义文件?
【发布时间】:2014-11-13 01:22:24
【问题描述】:

标题确实说明了一切。

我正在为 JavaScript 中的自定义项目创建一个新的 d.ts 文件。在其他项目中,我使用了第三方定义文件。有一种混合物。有些人包含类的私有属性和方法,而有些人则没有。

有正确的方法吗?我会假设私人元素的意图是让他们保持这种状态。但从技术上讲,任何人都可以覆盖私有元素吗(在 JS 中)?我也担心忽略它们会留下一些漏洞。例如,如果一个类有一个未定义的私有update() 方法,那么我扩展该类,并编写一个update() 方法。我觉得这里有冲突。

如果有任何建议,我将不胜感激。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    这取决于 JavaScript 实现,我会避免暴露不在原型上的私有成员。

    假设我们有以下 JavaScript:

    var Example = (function () {
        var update = function() {
            alert('Private');
        }
    
        function Example() {
        }
    
        Example.prototype.doIt = function () {
            update();
        };
        return Example;
    })();
    

    如果我这样声明:

    declare class Example {
        update(): void; // private
        doIt(): void;
    }
    

    看起来我可以从子类调用super.update(),但这会失败,因为超类上的update 函数不在作用域内。

    在这种情况下,我会将其排除在声明之外,以确保防止此类错误(在运行时发生)。

    declare class Example {
        doIt(): void;
    }
    

    如果 update 函数已添加到原型中,您应该将其添加到定义中(感谢 Ryan 提供的理由)。

    【讨论】:

    • 在类中始终包含私有成员(来自原型)的原因是,子类知道不定义具有相同名称的成员(因此完全破坏了类,原因不为人知)。
    • 很棒的东西@RyanCavanaugh - 更新以反映这一点。
    • 非常感谢大家。非常感谢您的详尽建议。
    猜你喜欢
    • 2011-05-22
    • 1970-01-01
    • 2018-07-25
    • 2021-10-29
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多