首页 > 解决方案 > 使用类数组的更简单方法

问题描述

我有一个类,然后定义了一个类的数组,每次我想向数组中添加一个节点时,我不得不提到我不喜欢的类名:

export class ItemModel {
  constructor(
    ID,
    Name
  ) {
    this.ID = ID;
    this.Name = Name; 
  }
}

export var ItemsArray = [];

ItemsArray.push(new ItemModel(0, "BreakFast"));
ItemsArray.push(new ItemModel(1, "Lunch"));
ItemsArray.push(new ItemModel(2, "Dinner"));

看完这篇文章后:

https://answers.unity.com/questions/637902/how-to-use-javascript-array-with-classes.html

我试图在定义数组时声明类,如下所示:

var ItemsArray : ItemModel[];

但我收到错误:“类型只能在 .ts 文件中使用。

我搜索了谷歌,但没有一个是有帮助的。

任何建议将不胜感激。

标签: javascript

解决方案


您链接到的帖子是使用TypeScript,它是一种与 JavaScript 不同的语言:它是 JavaScript 的超集(可编译为 JavaScript),它添加了静态类型(以及一些其他功能,如构造函数中的自动属性初始化)。

此 TypeScript 行:

var ItemsArray : ItemModel[];

相当于这个 JavaScript:

var ItemsArray;

只是 TypeScript 版本声明ItemsArray变量具有静态类型 ItemModel[]

如果您使用 JavaScript 本身,则无需定义变量的类型。你export var ItemsArray = [];的很好(除了我会使用letorconst代替var)。


旁注:您可以使用数组初始化器在 JavaScript 中更简洁地编写该数组:

export const ItemsArray = [
    new ItemModel(0, "BreakFast"),
    new ItemModel(1, "Lunch"),
    new ItemModel(2, "Dinner")
];

这也是有效的 TypeScript,即使没有类型声明:TypeScript 会推断出您想要的类型(因为 TypeScript 会ItemsArray进行类型推断并且它可以看到您正在填充对象)。ItemModel[]ItemsArrayItemModel

如果你想从一个空数组开始但仍然给它一个静态类型,你可以这样做:

//                                   /------ Telling TypeScript to use ItemModel[]
//                      vvvvvvvvvvvvv        as the type
export const ItemsArray : ItemModel[] = [];
//                                   ^^^^^-- Initializing ItemsArray with an
//                                           empty array

然后你的push电话会被类型检查,所以这会起作用:

ItemsArray.push(new ItemModel(0, "BreakFast"));

但这会导致错误(在 TypeScript->JavaScript 编译期间)

ItemsArray.push("BreakFast");

因为"Breakfast"不兼容ItemModel


旁注 2:JavaScript(和 TypeScript)中压倒性的约定是变量以小写字母开头,而不是大写字母。所以itemsArray而不是ItemsArray.


推荐阅读