根据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属性?
答案 0 :(得分:13)
如果要使用get
和set
访问者,则必须在私有属性前加下划线。在所有其他情况下,不要使用它。我会说使用下划线和加速器是一种特殊情况,尽管它没有明确地写在Coding guidelines中,但它并不意味着它是错误的。他们在official documentation中使用它。
首先,我想强调field
和property
之间的区别。在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 :(得分: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);
}