首页 文章

TypeScript类型的数组用法

提问于
浏览
93

我有一个像这样开始的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[] 并使用 new Array() 初始化_possession,则不会抛出异常 . 我错过了什么?

3 回答

  • 51

    您的语法中有错误:

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

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

    它也是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[] = [];
    

    or

    // declare
    private _possessions: Array<Thing>;
    // or -> preferd by ts-lint
    private _possessions: Thing[];
    
    constructor(){
        //assign
        this._possessions = new Array<Thing>();
        //or
        this._possessions = [];
    }
    
  • 8

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

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

相关问题