2017-01-22 2 views
2

In einer App, die WebSockets verwendet, möchte ich Socket-Close-Codes Strings zuordnen, so dass ich beim Schließen des Ereignisses die Nachricht vom numerischen Code abrufen kann. Im Moment bin ich Export nur ein Objekt aus einem „Konstanten“ -Modul, etwa so:TypeScript: So erstellen Sie ein schreibgeschützt numerisch indiziertes Objekt

export const CloseCodes: { [index: number]: string } = { 
    1000: "Normal closure", 
    1001: "The endpoint is going away", 
    1002: "The endpoint is terminating" 
    // etc. 
} 

Auf Steckdose in der Nähe, kann ich die event.code in einen String über CloseCodes[event.code] Karte, das ist, was ich will, aber ich kann auch CloseCodes[event.code] = "garbage", CloseCodes[1234]="hello" und delete(CloseCodes[event.code]) tun, die alle unerwünscht sind. Gibt es eine Möglichkeit, eine schreibgeschützte, numerisch indexierte Struktur für diese Art der Verwendung zu erstellen? Ich suche nach einem TypeScript-Weg, dies zu tun, nicht nach einem ES6 Object.defineProperty(...) Weg.

Antwort

1

Ja, erklären sie einfach mit einem readonly index signature:

export const CloseCodes: { readonly [index: number]: string } = { 
    1000: "Normal closure", 
    1001: "The endpoint is going away", 
    1002: "The endpoint is terminating" 
    // etc. 
} 

// Both "Index signature in type '{ readonly [index: number]: string; }' only permits reading." errors: 
CloseCodes[1000] = "bad"; // error! 
delete CloseCodes[1000]; // error! 

I readonly auf die oben eingeführt wurde, in Typoskript 2.0, so müssen Sie werden mit zumindest, dass die Version von Typoskript gezeigt mit glauben. Beachten Sie auch, dass Sie den Löschoperator was a very recent TypeScript change nicht zulassen, sodass dieses Verhalten in Ihrem Projekt möglicherweise noch nicht angezeigt wird.

+0

Danke, das funktioniert. Ich bekomme keinen Fehler mit 'delete WsCloseCodes [1000];', obwohl nicht sicher, warum, seit ich TypeScript 2.1.4. Wie auch immer, das ist, was ich gesucht habe. – 4EverLive

Verwandte Themen