TypeScript

时间:2016-11-14 11:39:31

标签: typescript parameters naming-conventions

根据offical style guide你应该

  

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

由于我来自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;
    }
}

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

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

修改
对不起,我错过了实际导致TS编译器错误的代码的基本部分 使用TypeScript的 get set 属性会产生错误。

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

3 个答案:

答案 0 :(得分:13)

答案

如果要使用getset访问者,则必须在私有属性前加下划线。在所有其他情况下,不要使用它。我会说使用下划线和加速器是一种特殊情况,尽管它没有明确地写在Coding guidelines中,但它并不意味着它是错误的。他们在official documentation中使用它。

下划线的原因

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

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

private int id;

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

public setId(int value) {
    this.id = value;
}

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

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

//increment id by 1
device.setId(device.getId() + 1);

另一方面, C#的设计使其更易于使用属性:

private int id;

public int Id {
    get {
        return this.id;
    }
    set {
        this.id = value;
    }
}

(值始终是指定值。)

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

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

//increment id by 1
i

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

TypeScript 中,您可以定义" true" C#类属性(带封装)。您可以使用Accessors

private _id: number;

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

public set id(value: number) {
    this._id = value;
}

用法:

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

//increment id by 1
device.id++;

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

  1. 在JavaScript中,所有班级成员都是公开的。因此,通过在私有财产之前加下一个下划线,我们签字,这个属性(字段)是私有的,只能由它的公共财产访问。
  2. 如果您使用相同名称命名私有属性和公共属性,则JavaScript解释器不知道是否访问私有属性或公共属性。因此,您会收到您正在撰写的错误:[ts]重复的标识符' id'。

答案 1 :(得分:1)

如果问题严格:

  

有没有办法遵循 [typeScript] 样式指南并使用get / set   TypeScript的属性?

TypeScript样式指南说:

  

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

然后,您可以使用$(美元符号)代替_(下划线)来为您的私人字段添加前缀。通过这种方式,您既可以摆脱[ts] Duplicate identifier 'blablabla'错误,又可以遵守TypeScript样式指南。

此外,我只是认为,.$组合比._组合更具可读性。

答案 2 :(得分:0)

对于属性访问器,请使用_

请参阅Microsoft https://www.typescriptlang.org/docs/handbook/classes.html#accessors的示例:

let passcode = "secret passcode";

class Employee {
private _fullName: string;

get fullName(): string {
    return this._fullName;
}

set fullName(newName: string) {
    if (passcode && passcode == "secret passcode") {
        this._fullName = newName;
    }
    else {
        console.log("Error: Unauthorized update of employee!");
    }
}
}
let employee = new Employee();
employee.fullName = "Bob Smith";
if (employee.fullName) {
console.log(employee.fullName);
}