TypeScript类型化数组的用法


96

我有一个像这样开始的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'的值:对象为null或未定义”。

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

Answers:


120

您的语法有误:

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

这不会创建“事物数组”。要创建事物数组,您可以简单地使用数组文字表达式:

this._possessions = [];

如果要设置数组构造函数的长度:

this._possessions = new Array(100);

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

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();
        }
    }
}

2
它不能固定长度,而应该预先分配数组
Sebastian

为什么不能private _possessions: Thing[] : []; 在类定义中做?
SuperUberDuper

54

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

这也是typescript建议的数组声明方法

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

// 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 = [];
}

3
要预分配大小,请使用new Array<Thing>(100)
Doug Domeny '16

1
您也可以使用... <事物> []
danday74

@ danday74-我已更新为包含您的方法,这是使用ts-lint推荐/最新配置时的默认设置。
Kieran

9

翻译是正确的,表达式的类型不正确。TypeScript错误地将表达式键入new Thing[100]为数组。Thing使用index运算符对index (构造函数)进行索引应该是错误的。在C#中,这将分配100个元素的数组。在JavaScript中,它调用索引100处的值,Thing就好像是构造函数一样。由于该值为undefined它会引起您提到的错误。而要使用JavaScript和TypeScript new Array(100)

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


1
我不想要新的Array(100)。我想要Thing的类型化数组。我不知道这是错误还是仅仅是我对文档规范的误解。
克劳斯·恩吉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.