TypeScript的getter和setter约定

3

在TypeScript中,类属性的约定(标准)是什么?

在angular.io的英雄之旅演示中,所有属性都设置为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编码规范?
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');

3
可能是与https://dev59.com/G2cs5IYBdhLWcg3wdz1m重复的问题。 - Peter Keuter
这个可能有帮助吗?https://dev59.com/gWcs5IYBdhLWcg3wmlMK - Shane van Wyk
1
请注意,hero instanceof Hero === truehero2 instanceof Hero === false,因此它们不同。 - David Sherret
不存在所谓的“类属性”。你可能指的是“类属性”。也不存在所谓的“instanciating”[错别字]属性。你可能是想说“设定”。无论如何,如果你想知道你写的代码是否可行,只要试一试就好了(你会发现它是可以的)。 - user663031
5个回答

1

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

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

0

Typescript会转换成普通的JavaScript,所以……如果你需要在设置值之前或之后做一些操作,比如日志记录,你可以自己实现。

如果不需要的话,getter和setter就显得有点过度了。

对于我来说,实例化和设置器(setters)在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
有没有Java风格的约定?
你可以这样做,但由于它们是不同的语言,你可能应该使用TypeScript约定,通常通过“.”符号直接访问“成员”.. 这对任何使用TypeScript的人来说更易读.. 甚至对Java开发人员也是如此 :) 尽管我很喜欢Java,但我意识到按照传统方式编码会让我打两倍于有用的代码。
事实上,开发人员之间的一个常见笑话是,像Java这样的语言过度声明。
简而言之,不要使用Java风格的约定,使用myObject.myMember直接访问成员。

-1
有没有类似于这样的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 类型检查的 结构性 本质的一个弱点(或方便之处)。更多信息。


没有人禁止你这样做,但这不是惯例,而且过于冗长,很快就会变得非常丑陋。 - Laurent Schwitter
1
这种方法实际上回答了OP的问题,并且具有合理的警告和准确性,并在TypeScript文档中引用https://www.typescriptlang.org/docs/handbook/classes.html#accessors。 - Marty

-1

你想使用Java风格是因为在设置单个属性周围有额外的代码吗?如果是这样,你可以在类的构造函数中声明属性。

英雄类

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

声明

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接