Een TypeScript-enum maken met weergavewaarde
Ik heb een TypeScript-enum die er als volgt uitziet:
enum State {
NotRequired,
Working,
PendingReview,
Reviewed,
Done
}
En dit genereert dit:
var State;
(function (State) {
State[State["NotRequired"] = 0] = "NotRequired";
State[State["Working"] = 1] = "Working";
State[State["PendingReview"] = 2] = "PendingReview";
State[State["Reviewed"] = 3] = "Reviewed";
State[State["Done"] = 4] = "Done";
})(State || (State = {}));
Ik zou graag de waarden hebben als een mooi gevormde string met spaties waar nodig.
Dus State[State["PendingReview"]=2]="PendingReview"; zou worden State[State["PendingReview"]=2]="Pending Review";
Het is mij gelukt iets dergelijks te bereiken door mijn enum als volgt te definiëren:
enum State {
"Not Required",
Working,
"Pending Review",
Reviewed,
Done
}
Het nadeel hiervan is echter dat ik om een enumwaarde in de code met een spatie te gebruiken nu mijn sleutel moet gebruiken.
Dus State.PendingReview moet nu zo worden gebruikt State["Pending Review"]
Kan ik het beste van twee werelden hebben door op de een of andere manier een alternatieve weergavestring voor mijn sleutel te definiëren?
Zodat wanneer ik State[State.PendingReview] zeg, het mij de waarde "Pending Review" geeft
Antwoord #1
Aangezien je geen expliciete waarden voor de enum opgeeft, kun je net zo goed een string-enum gebruiken (beschikbaar vanaf TypeScript 2.4) hiervoor:
enum State {
NotRequired = "Not Required",
Working = "Working",
PendingReview = "Pending Review",
Reviewed = "Reviewed",
Done = "Done"
}
De weergavewaarde wordt dan eenvoudigweg bijvoorbeeld State.NotRequired.
Antwoord #2
Aangezien enums geen tekenreekswaarden ondersteunen, is het beter om een klasse met statische velden zoals deze te gebruiken.
Je hebt de compilatiecontroles, zoals als je een enum zou gebruiken, noem je het ook op dezelfde manier in je code.
module rizze.tests {
enum State{
NotRequiered,
Working,
Pending,
Reviewed,
Done
}
class StateConvert {
static NotRequiered="Not Required";
static Working="I'm Working";
static Pending = "Pending Review";
static Reviewed="Reviewed Done";
static Done="Done All";
static convert(state:State):String{
if( state == null) return null;
switch(state){
case State.NotRequiered:{return StateConvert.NotRequiered;}
case State.Working:{return StateConvert.Working;}
case State.Pending:{return StateConvert.Pending;}
case State.Reviewed:{return StateConvert.Reviewed;}
case State.Done:{return StateConvert.Done;}
}
console.log("Error state undefined + " +state );
return null;
}
}
export class StateTest {
constructor(){
let state:State = State.Reviewed;
console.log("state:"+state + " / " + StateConvert.convert(state));
}
}
//TEST
let s:StateTest= new StateTest();
}
