繁体   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