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?
-
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(); } } }
-
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 indexThing
, 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 ofThing
as if was a constructor. Since that values isundefined
it raises the error you mentioned. In JavaScript and TypeScript you wantnew Array(100)
instead.You should report this as a bug on CodePlex.
Originally posted 2013-11-09 18:41:17.