Typescript - 变量声明

6

我不确定这个问题是否适合在这里提问,但我被告知代码审查不适合这个问题。

我正在学习Angular 2和Typescript,所以正在按照以下教程进行学习:

https://angular.io/docs/ts/latest/tutorial/toh-pt4.html

在第三部分和第四部分之间,app.component.tsheroes 变量的声明发生了变化,从以下内容改为:
export class AppComponent {
    heroes = HEROES;
}

到:

export class AppComponent {
    heroes: Hero[];
}

我理解第一个将其设置为常量英雄数组,但为什么第二个使用冒号而不是将其设置为空数组?
将第二个更改为=实际上会抛出表达式预期的错误,因此基本上我只是试图了解两者之间的区别。
4个回答

5
heroes: Hero[];

不设置它的值。它只是定义了一个属性

  • 名称 = heroes
  • 类型 = Hero[],表示Hero数组
  • 没有分配一个值,这将使其保持默认值null

初始化后,它会变成这样

heroes: Hero[] = [new Hero('Spidey'), new Hero('Batman')];

1
不确定您所说的数字是什么意思。我已经更新了我的答案。 - Günter Zöchbauer

1
第一个的区别在于,它是javascript,你将你的heroes变量赋值给常量**HEROES*。
第二个是typescript的东西,你说heroes变量将是一个英雄数组,基本上你正在定义一个空变量。
就像java或c#中,在你的类上做public int myNumber之类的事情。

1
很不错,我喜欢c#的比较 - 我猜这正是让我感到迷惑的原因,因为我知道它正在转换为js,我还以为它也在设置变量,因为在那个意义上js没有强类型变量。 - Pete

1
你的第一次理解是正确的。
heroes = HEROES

现在,
heroes : Hero [ ];

这里的Hero代表具有某些属性的类。通过这行代码,您告诉TypeScript编译器heroes变量将保存对象列表,类型为Hero(自定义或用户定义类型)。在面向对象编程世界中,class是一种用户定义的数据类型,因此您可以使用该类型声明任何变量。
请注意,您可以使用Type声明(:)任何变量,但不能将Type(在TypeScript中)分配给变量,但可以将该类型的数据分配给变量。
因此,在这里,您不能使用=
希望这可以帮助您...

0

仅补充@Günter Zöchbauer的观点,

在类/接口声明中,属性名称后面的:用于定义其类型。

然而,在您即时创建对象时,这可能会引起一些混淆,因为在这种情况下,:标记值分配:

interface MyInterface {
  myBooleanProperty: boolean = false;
}

// ... somewhere

let a = {
  myBooleanProperty: true
};

// and to add a little more fun

let b: MyInterface = {
  myBooleanProperty: true
}

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