TypeScript私有setter公共getter惯例

19

所以我想要一个不可变的Vector类。为此,我需要为x和y坐标拥有一个公共getter和一个私有setter,以便我可以在构造函数中实际初始化这些值。

我有几个选择,所以我想知道哪个是按照惯例的方法。

我可以像这样做:

class Vector {
    constructor(private _x: number, private _y: number) { }
    public get x() {
        return this._x;
    }

    public get y() {
        return this._y;
    }
}

但我不知道使用下划线是否是常见的做法。这可能会成为一个问题,因为该名称将在智能感应中可见。

第二个选项可能是

class Vector {
    constructor(private x: number, private y: number) { }
    public get X() {
        return this.x;
    }

    public get Y() {
        return this.y;
    }
}
据我所知,在JS中,只有类以大写字母开头,因此这也可能不是一个好主意。 处理这种情况的首选方法是什么?
1个回答

15

目前普遍共识是使用下划线。私有变量在类的外部自动完成中不会显示 - 因此在Vector实例上调用时,您不会看到_x_y在自动完成中出现。您只会在调用构造函数时看到它们,如果真的觉得很无礼,可以避免自动映射(尽管我更喜欢自动映射)。

class Vector {
    private _x: number;
    private _y: number;

    constructor(x: number, y: number) { 
        this._x = x;
        this._y = y;
    }

    public get x() {
        return this._x;
    }

    public get y() {
        return this._y;
    }
}

var vector = new Vector(1, 2);

目前还没有官方标准 - 但是如果有任何与外部代码交互的机会,最好遵循JavaScript样式命名约定,这将避免根据您是调用"我们制作的函数"还是"他们制作的函数"而来回切换约定。

在《代码大全》(Steve McConnell著)中,只避免大小写差异也是一项建议,这是另一个反对xX的不良点,除了你在问题中提到的命名约定点之外。


可能需要将number类型添加到xy属性声明中。 - WiredPrairie
嗯...我也是这么想的,但Playground没有正确推断它们(我认为这意味着编译器也没有)。 - WiredPrairie
3
下划线在JavaScript中是一种约定,因为JavaScript没有私有成员。不过,Typescript有私有成员。 - felixfbecker
@freshfelicio 在 TypeScript 中,与所有命名约定一样,我们更喜欢使用 JavaScript 约定 - 因为尽管 我们 编写的是 TypeScript,但人们 可能 会使用生成的 JavaScript。 - Fenton
4
问题在于,如果您不使用下划线,私有变量将与getter / setter具有相同的名称。 在C#中,通过将公共getter / setter大写来解决此问题。奇怪的是,TypeScript的惯例建议您不要使用下划线。 - Kokodoko
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接