Abdelkrim Abdelkrim - 2 months ago 5
TypeScript Question

Build: element implicitly has an 'any' type because index expression is not of type 'number'

We are transpiling our TypeScript 1.8 code forcing the software developer to set the types.

Here are the error messages:


  • Description: Build: Element implicitly has an 'any' type because index expression is not of type 'number'.

  • Project myProject

  • File: C:\dev\Scripts\machines.ts

  • Lines: 77, 78, 80, 81, 96, 110, 111, 220

  • Source: Build



QUESTION

How should we define the types of those variables?


  • _matrixQuantityProduct

  • _matrixQuantityLotSizeProduct

  • matrixQuantityProduct2

  • matrixQuantityLotSizeProduct2



Source code

private _machines: Machine[];
private _matrixQuantityProduct: Array<Array<number>>;
private _matrixQuantityLotSizeProduct: Array<Array<number>>;
private buildMatrixQuantity() {
let matrixQuantityProduct : Array<Array<number>> = new Array();
let matrixQuantityLotSizeProduct: Array<Array<number>> = new Array();

// on cree le array 2D et les cl├ęs dynamiques
for (let i = 0; i < this._machines.length; i++) {
let matrixQuantityProduct2 : Array<any> = [];
let matrixQuantityLotSizeProduct2: Array<any> = [];
for (let j = 0; j < this._machines.length; j++) {
matrixQuantityProduct2[this._machines[j].code] = 0; [line 77]
matrixQuantityLotSizeProduct2[this._machines[j].code] = 0; [line 78]
}
matrixQuantityProduct[this._machines[i].code] = matrixQuantityProduct2; [line 80]
matrixQuantityLotSizeProduct[this._machines[i].code] = matrixQuantityLotSizeProduct2; [line 80]
}

this.listMatrixLog(matrixQuantityProduct, matrixQuantityLotSizeProduct);

let _productCodeElements: Element[] = this._productModel.getProducts();
for (let i = 0; i < _productCodeElements.length; i++) {
let _quantityProduct: number = this._productModel.getQuantityProduct(_productCodeElements[i].nodeValue);
let _processCodeElements: Element[] = this._productModel.getProcessProduct(_productCodeElements[i].nodeValue);
for (let j = 0; j < _processCodeElements.length; j++) {

let _lotSizeOperation: Element[] = this._productModel.getLotSizeOperation(_productCodeElements[i].nodeValue, _processCodeElements[j].nodeValue);
let _machinesRefElements: Element[] = this._productModel.getResourceMachineProcess(_processCodeElements[j].nodeValue);
for (let k = 0; k < _machinesRefElements.length - 1; k++) {

matrixQuantityProduct[_machinesRefElements[k].nodeValue][_machinesRefElements[k + 1].nodeValue] += _quantityProduct; [line 96]
//matrixQuantityLotSizeProduct[][] += (_quantityProduct /parseInt(_lotSizeOperation[k].nodeValue)) ;

}
}
}
this.listMatrixLog(matrixQuantityProduct, matrixQuantityLotSizeProduct);

this._matrixQuantityProduct = matrixQuantityProduct;
}

private listMatrixLog(matrixQuantityProduct: Array<Array<number>>, matrixQuantityLotSizeProduct: Array<Array<number>>) {
for (let i = 0; i < this._machines.length; i++) {
for (let j = 0; j < this._machines.length; j++) {
this._log.trace("Machine/listMatrix - Quantity Matrixf : " + matrixQuantityProduct[this._machines[i].code][this._machines[j].code]); [line 110]
this._log.trace("matrice quantityLotSize indice i = " + this._machines[i].code + " indice j = " + this._machines[j].code + " ,contient: " + matrixQuantityLotSizeProduct[this._machines[i].code][this._machines[j].code]); [line 111]
}
}
}


let cylinder = BABYLON.Mesh.CreateCylinder("cylinder", distance, this._matrixQuantityProduct[machineA][machineB] / 50, this._matrixQuantityProduct[machineA][machineB] / 50, 36, 1, this._scene, true); [line 220]

Answer

It looks like you have some logical problems inside your code. Assuming that code property is of type string, the following lines does not play nice together:

let matrixQuantityProduct2: Array<any> = [];
matrixQuantityProduct2[this._machines[j].code] = 0;

Lets say this._machines[j].code evaluates to '123'.

So you define variable of type array and try to access its element by string key '123'. In such case you will get value of the property 123 on matrixQuantityProduct2 object. That is probably not there - its an array after all?

Most likely you would like to use matrixQuantityProduct2 as a dictionary. In such case you can have it like this:

interface INameToValueMap
{
    [key: string]: any;
}

let matrixQuantityProduct3: INameToValueMap = {};
matrixQuantityProduct3["123"] = 0;

Note initialization with {} instead of [].

As a side note. You can disable such errors by setting "noImplicitAny": false in your tsconfig.json compilerOptions section. But I would not recommend doing this.

Hope this helps.