javascript - Finns det ett sätt att komma åt ett barnobjekt i typescript genom att kedja variabelnamn


Koden jag försöker ersätta:

this.selectedArray1.indexOf(someIndexObject);

Koden jag försöker ersätta den med:

var someVariable = "selectedArray1"
this[someVariable].indexOf(someIndexObject);

När jag gör ovanstående ersättning får jag dock ett kompileringsfel

TS2538: Type 'String' cannot be used as an index type

Är det möjligt att göra något sådant i TypeScript?

Svar #1

Typescript kommer att förhindra att du gör detta som standard, om det inte kan bevisa att strängen är en nyckel till typen eller att typen har en indexsignatur

Med något som är känt för att vara en nyckel:

class Foo {
    selectedArray1 = [];
    method(){
        this['selectedArray1'] //ok the result is of the same type as the field
        const s = 'selectedArray1'; // ok
        this[s] // ok, the result is of the same type as the field
        var someVariable = "selectedArray" + 1 // not provable to be a key
        this[someVariable]  // error
        this[someVariable as keyof this] // but ok with an assertion, but is a union of all field types of this
    }
}

Eller med en indexsignatur:

class Foo {
    [s: string] : any
    selectedArray1 = [];
    method(){
        var someVariable = "selectedArray" + 1 // not provable to be a key
        this[someVariable]  // ok, anything goes is of type any
    }
}