TypeScript typed array usage-Collection of common programming errors

I have a TypeScript class definition that starts like this;

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];
        }

Looks like an array of type Thing does not get translated correctly to the corresponding Javascript array type. This is a snippet from the generated Javascript:

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

Executing code containing a Person object, throw an exception when attempting to initialize the _possession field. Error is “0x800a138f – Microsoft JScript runtime error: Unable to get value of the property ‘100’: object is null or undefined”.

If I change the type of _possession to any[] and initialize _possession with new Array() exception is not thrown. Did I miss something?

  1. You have an error in your syntax here:

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

    This doesn’t create an “array of things”. To create an array of things, you can simply use the array literal expression:

    this._possessions = [];
    

    Of the array constructor if you want to set the length:

    this._possessions = new Array(100);
    

    I have created a brief working example you can try in the 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();
            }
        }
    }
    
  2. The translation is correct, the typing of the expression isn’t. TypeScript is incorrectly typing the expression new Thing[100] as an array. It should be an error to index Thing, a constructor function, using the index operator. In C# this would allocate an array of 100 elements. In JavaScript this calls the value at index 100 of Thing as if was a constructor. Since that values is undefined it raises the error you mentioned. In JavaScript and TypeScript you want new Array(100) instead.

    You should report this as a bug on CodePlex.

Originally posted 2013-11-09 18:41:17.