100

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

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

4

3 回答 3

122

您的语法有错误:

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();
        }
    }
}
于 2012-10-13T09:22:20.517 回答
58

在 typescript 中声明数组时有两个可用的语法选项。打字稿文档使用Array<T>但是 ts-lint 更喜欢T[]

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

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

或者

// declare then assign in the constructor
private _possessions: Array<Thing>; // or
private _possessions: Thing[]; // or -> preferd by ts-lint
  
constructor(){
    this._possessions = new Array<Thing>(); // or
    this._possessions = []; // or
}
于 2014-03-06T04:42:06.357 回答
9

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

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

于 2012-10-13T07:52:37.080 回答