TypeScript类型的数组用法

时间:2012-10-13 05:33:06

标签: arrays typescript

我有一个像这样开始的TypeScript类定义;

module Entities {          

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = new Thing[100];
        }

看起来Thing类型的数组无法正确转换为相应的Javascript数组类型。这是生成的JavaScript代码段:

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}

执行包含Person对象的代码,在尝试初始化_possession字段时抛出异常:

  

错误是“0x800a138f - Microsoft JScript运行时错误:无法获取属性'100'的值:object为null或undefined”。

如果我将_possession的类型更改为any[]并使用new Array()初始化_possession,则不会抛出异常。我错过了什么吗?

3 个答案:

答案 0 :(得分:115)

您的语法错误:

this._possessions = new Thing[100]();

这不会创造“一系列事物”。要创建一个数组,您只需使用数组文字表达式:

this._possessions = [];

如果要设置长度,则为数组构造函数:

this._possessions = new Array(100);

我创建了一个简短的工作示例,您可以在playground中尝试。

module Entities {  

    class Thing {

    }        

    export class Person {
        private _name: string;
        private _possessions: Thing[];
        private _mostPrecious: Thing;

        constructor (name: string) {
            this._name = name;
            this._possessions = [];
            this._possessions.push(new Thing())
            this._possessions[100] = new Thing();
        }
    }
}

答案 1 :(得分:51)

您可以尝试其中任何一种。他们没有给我错误。

这也是typescript for array declaration建议的方法。

通过使用Array<Thing>,它正在使用打字稿中的泛型。它类似于在c#代码中要求List<T>

// Declare with default value
private _possessions: Array<Thing> = new Array<Thing>();
// or
private _possessions: Array<Thing> = [];
// or -> prefered by ts-lint
private _possessions: Thing[] = [];

// declare
private _possessions: Array<Thing>;
// or -> preferd by ts-lint
private _possessions: Thing[];

constructor(){
    //assign
    this._possessions = new Array<Thing>();
    //or
    this._possessions = [];
}

答案 2 :(得分:8)

翻译是正确的,表达式的输入不是。 TypeScript错误地将表达式new Thing[100]键入为数组。使用索引运算符索引Thing(构造函数)应该是错误的。在C#中,这将分配一个包含100个元素的数组。在JavaScript中,它调用Thing的索引100处的值,就像是构造函数一样。由于该值为undefined,因此会引发您提到的错误。在JavaScript和TypeScript中,您需要new Array(100)代替。

您应该将此报告为CodePlex上的错误。