【问题标题】:TypeScript typed array usageTypeScript 类型化数组的使用
【发布时间】:2012-10-03 22:21:32
【问题描述】:

我有一个这样开头的 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 的 sn-p:

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

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

错误为“0x800a138f - Microsoft JScript 运行时错误:无法获取属性 '100' 的值:对象为空或未定义”。

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

【问题讨论】:

    标签: arrays typescript


    【解决方案1】:

    你的语法有错误:

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

    【讨论】:

    • 它不固定长度,而是应该预先分配数组
    • 为什么不能在类定义中做private _possessions: Thing[] : [];
    【解决方案2】:

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

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

    // 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
    }
    

    【讨论】:

    • 要预先分配大小,请使用new Array&lt;Thing&gt;(100)
    • 你也可以使用... []
    • @danday74 - 我已更新以包含您的方法,这是使用 ts-lint 推荐/最新配置时的默认设置。
    【解决方案3】:

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

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

    【讨论】:

    • 我不想要新的 Array(100)。我想要一个类型的事物数组。我不知道这是一个错误还是我对文档规范的误解。
    猜你喜欢
    • 2020-07-27
    • 2021-12-18
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2012-11-04
    • 2022-11-18
    • 2020-05-14
    相关资源
    最近更新 更多