TypeScript中类属性的命名约定

len*_*nny 16 parameters naming-conventions typescript

根据你应该 的官方风格指南

避免使用下划线为私有属性和方法添加前缀.

由于我来自Java背景,我通常只使用this关键字:

export default class Device {
    private id: string;

    constructor(id: string) {
        this.id = id;
    }

    public get id(): string { // [ts] Duplicate identifier 'id'.
        return this.id;
    }

    public set id(value: string) { // [ts] Duplicate identifier 'id'.
        this.id = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

但TypeScript编译器抱怨:[ts]重复标识符'id'.

在TypeScript构造函数中是否存在参数命名的约定或最佳实践?

编辑
抱歉,我错过了实际导致TS编译器错误的代码的基本部分.
使用TypeScript 的getset属性会产生错误.

所以我更新了一个问题:有没有办法遵循样式指南并使用TypeScript的get/set属性?

Eri*_*pal 20

回答

如果要使用getset访问器,则必须在私有属性前加下划线.在所有其他情况下不要使用它.我会说使用下划线和加速器是一种特殊情况,尽管它没有明确地用编码指南编写,但这并不意味着它是错误的.他们在官方文档中使用它.

下划线的原因

对于开始,我想强调的区别fieldproperty.在Java或C#等标准高级OOP语言中,field是一个私有成员,对其他类不应该是可见的.如果要在考虑封装的情况下公开它,则应创建属性.

Java中,你这样做(它被称为Bean属性):

private int id;

public int getId() {
    return this.id;
}

public setId(int value) {
    this.id = value;
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过调用以下方法来访问该属性:

int i = device.getId();
device.setId(i);

//increment id by 1
device.setId(device.getId() + 1);
Run Code Online (Sandbox Code Playgroud)

另一方面,C#的设计使得使用属性更加容易:

private int id;

public int Id {
    get {
        return this.id;
    }
    set {
        this.id = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

(值始终是指定的值.)

您可以直接为这些属性指定值或获取属性值.

int i = device.Id;
device.Id = i;

//increment id by 1
i
Run Code Online (Sandbox Code Playgroud)

在纯JavaScript中,没有真正的字段,因为类成员总是公开的; 我们简单地称它们为属性.

TypeScript中,您可以定义"真正的"类C#属性(使用封装).你使用Accessors.

private _id: number;

public get id(): number {
    return this._id;
}

public set id(value: number) {
    this._id = value;
}
Run Code Online (Sandbox Code Playgroud)

用法:

let i: number = device.id;
device.id = i;

//increment id by 1
device.id++;
Run Code Online (Sandbox Code Playgroud)

必须在这里使用下划线,原因有两个:

  1. 在JavaScript中,所有类成员都是公共的.因此,通过在私有属性之前加上下划线,我们签名,此属性(字段)是私有的,只能由它的公共属性访问.
  2. 如果您使用相同名称命名私有属性和公共属性,则JavaScript解释器将不知道是访问私有属性还是公共属性.因此,您得到了您正在撰写的错误:[ts]重复的标识符"id".