【问题标题】:Why are underscores added to fields of a typescript class in angular4?为什么在 angular4 的 typescript 类的字段中添加下划线?
【发布时间】:2017-12-23 08:18:43
【问题描述】:

我正在构建一个 Angular4 项目并使用 IntelliJ。每当我创建一个新类,然后添加 getterssetters。 IDE 为字段添加下划线。

因为打字稿语法似乎被 IDE 自动识别,但以这种方式创建字段,让我认为这是一种最佳实践,但我也读到不应该这样做。

IDE 为什么要这样做?我应该允许它为一个有角度的项目做这个吗?感谢您的帮助!

在创建 getter 和 setter 之前

export class Test {


  hello:string;
  world:string;


}

在创建 getter 和 setter 之后

export class Test {


  private _hello:string;
  private _world:string;

  get hello(): string {
    return this._hello;
  }

  set hello(value: string) {
    this._hello = value;
  }

  get world(): string {
    return this._world;
  }

  set world(value: string) {
    this._world = value;
  }
}

【问题讨论】:

  • 你能发布一个代码示例吗?
  • @Maximus 我添加了一个代码示例,变量_hello 在我添加getter 和setter 之前是hello。
  • 私有变量以_开头,仅此而已
  • 可能值得注意的是,如果你有一个 json 对象 const json = { "hello": "foo", "world": "bar" }const baz = new Test() 那么你可以只做 Object.assign(baz, json) 它将调用设置器并正确分配给私有 _hello 和 @ 987654328@ 属性。

标签: angular typescript intellij-idea


【解决方案1】:

getter/setter 的名称不能与属性名称匹配 - 以下将不起作用:

class A {
   get world() {
      return this.world;
   }
}

所以一般模式是像 setter/getter 一样命名内部属性,只使用下划线的版本:

class A {
   get world() {
      return this._world;
   }
}

由于 JS 和 TS 缺乏运行时封装,下划线通常表示内部/私有/封装的属性/变量。

但没有什么会强迫你使用下划线。如果您以不同的方式命名 getter/setter,则可以避免添加下划线:

class A {
   get getWorld() {
      return this.world;
   }
}   

【讨论】:

  • 好的,谢谢,但我不得不说,这很烦人,因为这意味着在我的rest服务的API级别,我必须按顺序将所有字段的开头都命名为_使反序列化过程正确发生。这不是用于 api 的语言 java 中的最佳实践。
  • 是否有解决此问题的最佳做法?
  • 什么烦人? IDE 行为还是您应该有相应的属性名称和下划线?
  • 这很烦人,因为这意味着在我的 rest 服务的 API 级别,我必须在开头用 _ 命名所有字段,以便反序列化过程正确进行跨度>
  • 我还发现,也许最好的解决方案可能根本不会触及 typescript 代码,但在(在 java 的情况下)使用 jackson 库并使用 @JsonProperty 注释来定义 json 属性以及它应该如何映射到 java bean 字段。我认为这就是我们将如何解决我们的情况的问题......这是一个解释这一点的小例子。 stackoverflow.com/questions/12583638/… .... 这样后端开发人员可以像前端人员一样快乐:)
【解决方案2】:

您可以为Settings | Editor | Code Style | TypeScript | Code GenerationNaming conventions/Field prefix 中的字段指定不同的前缀。但请注意,将前缀留空会导致TS2300:Duplicate identifier 错误

【讨论】:

  • 所以你是说你必须为打字稿类中的每个字段都有一个前缀?因此,您需要在 api 级别为类的每个字段具有相同的前缀才能正确反序列化?
  • @Dan 或者你可以有一些映射名称的反序列化代码。如果您反序列化为具有方法的本地类,那么您不能直接使用 json 对象,因此无论如何您都需要某种映射。你可以看看使用类似npmjs.com/package/json-typescript-mapper
猜你喜欢
  • 1970-01-01
  • 2021-10-02
  • 2014-09-28
  • 1970-01-01
  • 2011-09-16
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
相关资源
最近更新 更多