TypeScript getter setter约定

时间:2016-05-30 19:30:21

标签: angular typescript

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');

5 个答案:

答案 0 :(得分:0)

打字稿被转换为计划javascript,所以...如果你需要在设定值之前或之后的东西,如何记录,你实施。 如果不需要,getter和setter就是矫枉过正。 对我来说,实例化和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";
......

答案 1 :(得分:0)

  

是否有java样式约定

如果你愿意,你可以这样做,但由于他们是不同的语言你可能应该使用通常直接访问"成员"通过。符号..这对任何使用打字稿的人来说都更具可读性..并且可以说是对java开发者而言:)尽管我喜欢java,但我确实认为编码通常会让我输入2次有用的内容。

事实上,开发人员常常开玩笑说java等语言过于陈述

tl; dr no ..使用myObject.myMember直接访问成员

答案 2 :(得分:0)

是因为要设置要使用Java样式的单个属性的额外代码吗?如果是这样,您可以在类的构造函数中声明属性。

英雄阶层

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

声明

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

答案 3 :(得分:0)

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 }
}

您的图书馆用户不会注意到。

答案 4 :(得分:-2)

  

是否有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类型检查的结构性质的弱点(或便利强度)。 More on this.