根据你应该做的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] Duplicate identifier 'id'.

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

使用TypeScript的getset属性会产生错误.

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

推荐答案

答复

如果要使用getset访问器,必须在私有属性前面加下划线.在所有其他情况下,不要使用它.我想说的是,在访问器中使用下划线是一种特殊情况,虽然它不是用Coding guidelines来明确写的,但并不意味着它是错误的.他们在official documentation中使用它.

下划线的原因

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

Java中,你可以这样做(称为Bean properties):

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
device.Id++;

在普通JavaScript中,没有真正的字段,因为类成员总是公共的;我们称之为财产.

TypeScript中,可以定义"真正的"类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'.

Typescript相关问答推荐

如何修复VueJS中的val类型不能赋给函数

Tailwind CSS样式不在Svelte应用程序中呈现

如果一个变量不是never类型,我如何创建编译器错误?

如何在使用`Next—intl`和`next/link`时导航

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

访问继承接口的属性时在html中出错.角形

如何将泛型对象作为返回类型添加到类型脚本中

TypeScrip:来自先前参数的参数中的计算(computed)属性名称

迭代通过具有泛型值的映射类型记录

为什么&;(交集)运算符会删除不相交的属性?

如何从输入中删除值0

有没有办法防止类型交集绕过联合类型限制?

API文件夹内的工作员getAuth()帮助器返回:{UserID:空}

如何从一个泛型类型推断多个类型

接口中可选嵌套属性的类型判断

递归类型别名的Typescript 使用

更漂亮的格式数组<;T>;到T[]

为什么过滤器不改变可能的类型?

Typescript 是否可以区分泛型参数 void?

基于参数的 TS 返回类型