TypeScript类型的数组用法

Kla*_*Nji 95 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];
        }
Run Code Online (Sandbox Code Playgroud)

看起来像Thing类型的数组无法正确转换为相应的Javascript数组类型.这是生成的JavaScript的一个片段:

function Person(name) {
    this._name = name;
    this._possessions = new Entities.Thing[100]();
}
Run Code Online (Sandbox Code Playgroud)

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

错误是"0x800a138f - Microsoft JScript运行时错误:无法获取属性'100'的值:对象为null或未定义".

如果我将_possession的类型更改为any[] 和初始化_possession new Array()没有抛出异常.我错过了什么?

Fen*_*ton 118

您的语法中有错误:

this._possessions = new Thing[100]();
Run Code Online (Sandbox Code Playgroud)

这不会产生"一系列事物".要创建一个数组,您只需使用数组文字表达式:

this._possessions = [];
Run Code Online (Sandbox Code Playgroud)

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

this._possessions = new Array(100);
Run Code Online (Sandbox Code Playgroud)

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

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 它不会修复长度,而是应该预先分配数组 (2认同)

Kie*_*ran 52

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

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

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

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

要么

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

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

  • 要预先分配大小,请使用`new Array <Thing>(100)`. (2认同)

chu*_*ckj 9

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

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