簡體   English   中英

TypeScript getter setter 約定

[英]TypeScript getter setter convention

TypeScript 中類屬性的約定(標准)是什么?

在 angular 2 演示(來自 angular.io 的 The Heroes Tour)中,所有屬性都設置為 public :

export class Hero {
   id: number;
   name: string;
}

所以它們可以通過兩種方式實例化:

var hero: Hero = new Hero();
hero.id = 0;
hero.name = "hero";

或者

var hero2: Hero = {id : 0, name: "hero"};

是否有 Java 風格約定(像這樣):

export class Hero {
   private id: number;
   private name: string;

   setId(id: number): Hero {
      this.id = id;
      return this;
   }

   setName(name: string): Hero {
      this.name = name;
      return this;
   }

   getId(): number {
      return this.id;
   }

   getName(): string {
      return this.name;
   }
}

聲明(示例):

var hero: Hero = new Hero();
hero.setId(0).setName('hero');

var hero2: Hero = new Hero().setId(0).setName('hero');

是否有 Java 風格約定(像這樣)

你可以做到這一點(事實上我做到了)。 人們也使用getter / setter

export class Hero {
   private _id: number;

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

但是,請注意不要在 setter 中放置太多邏輯: https : //basarat.gitbooks.io/typescript/content/docs/tips/propertySetters.html 我通常更喜歡顯式函數調用。

var hero2: Hero = {id : 0, name: "hero"};

這是 TypeScript 類型檢查的結構性質的一個弱點(或方便強度)。 更多關於這一點。

打字稿被轉換成計划javascript,所以......如果你需要設置值之前或之后的東西,如何記錄,你來實現。 如果不需要,getter 和 setter 是多余的。 對我來說,實例化和設置器與 Java 相同。

例子:

export class Person{
    public name: string;
    public anotherAttribute: string;
    private age: number;
    private _birth: Date;

    public set birth(birt: Date){
       this._birth = birth;
       this.age = calculateAge(birth);
    }
    .......
}


let person: Person = new Person();
person.name = "John";
......

是否有 Java 風格約定

好吧,如果您願意,您可以這樣做,但由於它們是不同的語言,您可能應該使用打字稿約定,這些約定通常通過 . 符號..對於使用打字稿的任何人來說,這都更具可讀性..並且可以說對於Java開發人員來說也是如此:)盡管我很喜歡Java,但我確實意識到傳統的編碼會讓我輸入2倍有用的東西。

事實上,Java 之類的語言過度聲明是開發人員之間的一個常見笑話

tl;dr no.. 使用 myObject.myMember 直接訪問成員

是因為圍繞設置您想要使用 Java 樣式的單個屬性的額外代碼嗎? 如果是這樣,您可以在類的構造函數中聲明屬性。

英雄類

export class Hero {
 constructor(public id?: number, public name?: string) {}
}

聲明

const hero1 = new Hero(1, 'hero');
const hero2 = new Hero();

Java 是一種靜態編譯語言。 在 Java 中,如果您發布一個帶有類的 .jar 庫

class Foo {
  public int bar;
}

然后決定圍繞該領域引入邏輯

class Foo {
  private int _bar;
  public int getBar() { return _bar - 1; }
  public void setBar(int v) { _bar = v + 1; }
}

任何使用您的 .jar 的代碼都會中斷,必須更新和重新編譯。 這就是為什么在 Java 中公開原始公共字段是一個很大的禁忌。

TypeScript 是 JavaScript 的超集,它是一種動態語言。 所有鏈接都是動態的。 您可以安全地發布帶有類的庫

class Foo {
  bar: number
}

如果您稍后發布更新

class Foo {
  private _bar: number
  get bar() { return this._bar - 1 }
  set bar(v: number) { this._bar = v + 1 }
}

您的圖書館用戶不會注意到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM