2017-03-13 3 views
1

Was ist der richtige Weg, Enum in Typoskript zuzuordnen?Mapping Enum in Typoskript

Zum Beispiel ich mit einem Online-Typoskript-Code-Editor spielte um und das funktioniert gut:

class Message 
{ 
    name: string; 
    min: number; 
    max: number; 
    messageType: MessageType; 
} 

enum MessageType 
{ 
    none, 
    email, 
    sms 

} 

var jsonObj = { 
    "name": "some name", 
    "min": 0, 
    "max": 10, 
    "messageType": MessageType.email 

} 

var messageInstance: Message = <Message>jsonObj; 

console.log(messageInstance); 

jedoch in meinem IDE MessageType.email zeigt einen Fehler von „Wert erwartet“, wenn ich es in einer JSON-Datei verwenden .

Wenn ich versuche:

"messageType": "MessageType.email" 

Im Online-Code-Editor dann, die einen Fehler erzeugt.

Ich bin gerade am Anfang und kann keine klaren Anweisungen finden, wie dies zu tun ist.

edit:

Ich habe gerade realisiert Aufzählungen Zahl basiert so "messageType": 2 oder was auch immer entsprechende Zahl wäre der richtige Weg zu gehen.

Gibt es eine Möglichkeit, die Enum in der JSON-Datei lesbar (dh so etwas wie MessageType.Email als Wert) als wenn allein gesehen die JSON-Datei nicht die Enum-Definitionen so verwirrend, so würde ich vielmehr tun es auf diese Weise, wenn möglich ..

Antwort

2

Für Typoskript 2.4+:

Sie Zeichenfolge Aufzählungen anstelle eines numerischen eNUM verwenden können:

enum MessageType 
{ 
    none = "none", 
    email = "email", 
    sms = "sms" 
} 

Für ältere Versionen von Typoskript:

Sie können einen enum Wert auf einen string wandeln die Indexer s‘enum mit:

const messageTypeAsString = MessageType[MessageType.email]; 

in die andere Richtung funktioniert auch:

const messageType: MessageType = MessageType[messageTypeAsString]; 

Soweit ich Ich weiß, dass es keine Möglichkeit gibt, diese Konvertierung beim Serialisieren/Deserialisieren von JSON zu automatisieren.

Die andere Option ist enum ganz zu überspringen und statische string s anstatt:

class MessageType { 
    static readonly none = 'none'; 
    static readonly email = 'email'; 
    static readonly sms = 'sms'; 
} 
type MessageTypeValue = 'none' | 'email' | 'sms'; 

const messageType: MessageTypeValue = MessageType.none; 
+0

Dank. Ich kenne diese Syntax nicht: 'type MessageTypeValue = 'none' | 'E-Mail' | 'SMS'; 'Wie heißt das? – Guerrilla

+0

Es ist ein [type alias] (https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-aliases). Es erstellt einen Typ namens "MessageTypeValue", der dem Union-Typ "none" entspricht 'E-Mail' | "sms". –