我应该尝试在 Typescript 中强制封装吗?

问题描述

让我们假设我有一个对象,它维护一个项目数组。在使用这个对象时,我想确保没有人可以直接将项目添加到数组中,而只能使用适当的方法。从外部,您可以迭代数组并从中获取项目,但您不应该能够添加项目。如果需要添加项目,则需要调用实例函数 addItem

Javascript 不支持功能,因为公开 Array 对象将使任何人都可以向其中添加项目。
使用 Typescript,我可以使用 getter 并返回 ReadOnlyArray 类型而不是 Array 类型。 所以我的对象可能看起来像这样:

class SomeObject {
    #items: Array<string> = new Array<string>();

    get items() : ReadOnlyArray<string> {
        return #items;
    }

    addItem(item: string) {
        // do something special ...
        #items.push(item);
    }
}

另一种方法是简单地将数组公开为类的属性

class SomeObject {
    
    items: Array<string> = new Array<string>();

    addItem(item: string) {
        // do something special ...
        items.push(item);
    }
}

我知道我并没有真正封装/隐藏我的数组,因为 ReadOnlyArray 是它唯一的语法糖,但它可以帮助防止有人不小心以错误的方式使用该对象。

这是否值得付出努力,我应该采用这种方法还是简单地将数组公开为属性
更广泛地提出这个问题:我应该尝试在 Typescript/Javascript 中强制执行 OOP 封装,还是应该直接忽略它,因为它不符合 Javascript 的习惯?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)