Typescript私有setter public getter约定

Luk*_*vat 15 javascript typescript

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

我有一些选择,所以我想知道哪一个是按照惯例.

我可以这样做:

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

    public get y() {
        return this._y;
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道使用下划线是否常见.这可能是一个问题,因为该名称将在intellisense中可见.

第二种选择可能是

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

    public get Y() {
        return this.y;
    }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,只有类在JS中以大写字母开头,所以这也许是一个坏主意.

处理这个问题的首选方法是什么?

Fen*_*ton 11

迄今为止的普遍共识是使用下划线.私有变量不会显示在类之外的自动完成中 - 因此您不会在实例上看到_x_y自动完成Vector.您将看到它们的唯一地方是在调用构造函数时,如果真的冒犯了,您可以避免自动映射(尽管我宁愿使用自动映射).

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);
Run Code Online (Sandbox Code Playgroud)

目前还没有官方标准 - 但如果有任何机会与外部代码进行交互,最好遵循JavaScript风格的命名约定,因为它会根据您是否调用"我们制作的函数"来回避免切换惯例"或"他们制造的功能".

仅在案例中避免差异也是Steve McConnell编写的Code Complete中的建议 - 这是另一个不好的反对点x,X以及您在问题中提到的命名约定点.

  • 下划线是_Javascript_中的约定,因为Javascript没有私有成员.打字稿虽然有. (2认同)
  • 问题是,如果不使用下划线,私有变量与 getter/setter 具有相同的名称。在 C# 中,这是通过将公共 getter/setter 大写来解决的。奇怪的是,打字稿约定建议您不要使用 _underscore。 (2认同)