web-dev-qa-db-ja.com

ビルド:インデックス式の型が「数値」ではないため、要素には暗黙的に「任意」の型があります

TypeScript 1.8コードをトランスコンパイルし、ソフトウェア開発者に型の設定を強制しています。

ここにエラーメッセージがあります:

  • 説明:ビルド:インデックス式のタイプが「数値」ではないため、要素には暗黙的に「任意」のタイプがあります。
  • プロジェクトmyProject
  • ファイル:C:\ dev\Scripts\machines.ts
  • 行:77、78、80、81、96、110、111、220
  • ソース:ビルド

[〜#〜] question [〜#〜]

これらの変数のタイプをどのように定義する必要がありますか?

  • _matrixQuantityProduct
  • _matrixQuantityLotSizeProduct
  • matrixQuantityProduct2
  • matrixQuantityLotSizeProduct2

ソースコード

    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]
12
Abdelkrim

コード内に論理的な問題があるようです。 codeプロパティが文字列型であると仮定すると、次の行は一緒にNiceを再生しません。

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

this._machines[j].codeが「123」と評価されたとしましょう。

したがって、配列型の変数を定義し、文字列キー「123」でその要素にアクセスしようとします。このような場合、123オブジェクトのプロパティmatrixQuantityProduct2の値を取得します。それはおそらくそこにありません-その配列は結局のところ?

ほとんどの場合、matrixQuantityProduct2を辞書として使用します。そのような場合は、次のようにすることができます。

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

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

{}の代わりに[]を使用した初期化に注意してください。

補足として。 tsconfig.json compilerOptionsセクションで"noImplicitAny": falseを設定することにより、このようなエラーを無効にできます。しかし、これを行うことはお勧めしません。

お役に立てれば。

29
Amid

96行目については、「nodeValue」は文字列型を返すようですので、parseInt()を使用して数値に変更してください。

matrixQuantityProduct[parseInt(_machinesRefElements[k].nodeValue)][parseInt(_machinesRefElements[k + 1].nodeValue)] += _quantityProduct;

その他については、コードを試してもエラーは発生しませんが、Array<any>を作成してArray<Array<number>>に保存しようとしている可能性があります

0
Jonatan Alama