Hvordan fungerer syntaksen for hash-variabelen i TypeScript?
...og hvor er det dokumentert?
Jeg har sett eksempler som dette rundt omkring:
class MyThing {
private _layers: { [id: string] : SimpleLayer } = {};
...
}
...og det fungerer, noe som er flott, men syntaksen er forvirrende for meg.
Hva er 'id'? Hvorfor er ikke syntaksen bare blah:{string:SimpleLayer}, som ikke fungerer. Jeg har også sett {[name: string]:Type} og {[index:string]:Type}.
Jeg har sett gjennom typescriptlang.org og prøvd å finne ut hvor dette faktisk er dokumentert, men jeg ser ut til å ikke finne det i det hele tatt.
Svar #1
TypeScript: Indeks-signaturer
Syntaksen for å definere indeksen er:
{ [Identifier: KeyType]: ValueType }
KeyType kan enten være string eller number.
Du kunne hevde at Identifier egentlig ikke er nødvendig siden det ikke brukes noe sted, men jeg tror det er nødvendig for å tvinge klasse-/grensesnittdesigneren til å indikere hva hashtabellnøkkelen skal representere (en id, navn, e-postadresse, osv.). Dette gir også muligheten for at intellisense viser navnet på hash-nøkkelen (slik Visual Studio gjør for andre språk), selv om jeg ikke tror Typescript intellisense gir dette for øyeblikket.
Svar #2
Når det gjelder spørsmålet ditt om hvorfor syntaksen ikke er enklere, spesielt noe som blah:{string:SimpleLayer}:
Fordi dette ville være tvetydig. Denne syntaksen eksisterer allerede og har en betydning:
var x: { string: SimpleLayer }
Dette erklærer en variabel x. Typen til x har en egenskap, kalt string, som er av typen SimpleLayer. Hvis jeg ønsket å bruke x, ville jeg gjort dette:
x.string = new SimpleLayer;
Det er mer åpenbart hvis vi bruker et ekte eksempel:
var circle: {radius: number}
Dette erklærer en variabel med én egenskap (radius) som er av typen number, det deklarerer ikke et hash-kart som mapper radius-typer til number-typer.
