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');
答案 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.