I Typescript, vad är array som funktionsnamn?


Koden nedan kompileras och körs korrekt av ts-node.

class C {
    ["abc"]() {
        return "C";
    }
}

let c = new C();

let className = c["abc"]();
console.log(className);

Men jag förstår inte följande som en klassens egenskap.

["abc"]() {}

Jag tror att det involverar ett koncept av beräknad egenskap, men jag förstår inte den här syntaxen.

Fråga 1:

["abc"] är en array med ett strängelement på index 0. Om du lägger till en funktionsdefinition runt det, då ["abc"](){}, vad är det då? Hur skulle du kunna använda en array som funktionsnamn?

Fråga 2:

varför inte på följande sätt för att anropa medlemsmetoden?

c.["abc"](); 

Svar #1

Precis som foo['bar'] och foo.bar är motsvarande sätt att komma åt ett objektmedlem, kan du använda indexersyntaxen med ['bar'] inom objektinitialiserare och klassdefinitioner.

För ditt exempel, där egenskapen är statiskt känd vid kompileringstid, erbjuder detta dig egentligen ingen fördel, eftersom det är direkt ekvivalent med följande:

class C {
    abc() {
        return "C";
    }
}

Men indexer-syntaxen tillåter dig några saker som annars inte skulle vara möjliga.

Till exempel kan du använda medlemsnamn som inte är giltiga identifierare, t.ex. namn som börjar med en siffra eller har ett bindestreck inuti:

class C {
    ['123foo']() { … }
    ['foo-bar']() { … }
}

Det gör det också möjligt att dynamiskt ange medlemsnamnet genom att ta det från en variabel:

let memberName = 'foo';
class C {
    [memberName]() { return 'bar'; }
}
console.log(new C().foo()); // bar

Detta används också för Symboler i JavaScript, som erbjuder ett sätt att definiera medlemmar på objekt som inte är fritt synliga utan endast är åtkomliga med direkt åtkomst till samma symbolobjekt. Detta kommer slutligen att möjliggöra ny hög nivå-funktionalitet, som Symbol.iterator gör för att iterera över anpassade typer.

Svar #2

varför inte på följande sätt för att anropa medlemmet metod

Japp, det skulle rekommenderas. Men om du vill driva något via konfiguration (inte statiskt), t.ex. en sträng från servern, kan du använda indexersyntaxen.