Oprettelse af TypeScript enum med visningsværdi
Jeg har en TypeScript-enum, der ser sådan ud:
enum State {
NotRequired,
Working,
PendingReview,
Reviewed,
Done
}
Og dette genererer dette:
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 = {}));
Jeg vil gerne have værdierne som en pænt formet streng med mellemrum, hvor det er nødvendigt.
Så State[State["PendingReview"]=2]="PendingReview"; ville blive State[State["PendingReview"]=2]="Pending Review";
Jeg har formået at opnå noget, der ligner dette, ved at definere min enum på følgende måde:
enum State {
"Not Required",
Working,
"Pending Review",
Reviewed,
Done
}
Dette har dog den ulempe, at for at bruge enhver enum-værdi i koden med et mellemrum, skal jeg nu bruge min nøgle i stedet.
Så State.PendingReview skal nu bruges sådan her State["Pending Review"]
Kan jeg få det bedste fra begge verdener ved på en eller anden måde at definere en alternativ visningstekst til min nøgle?
Så når jeg siger State[State.PendingReview] giver det mig værdien "Pending Review"
Svar #1
Da du ikke angiver eksplicitte værdier for enum, kan du lige så godt bruge et strengenum (tilgængeligt fra TypeScript 2.4) til dette:
enum State {
NotRequired = "Not Required",
Working = "Working",
PendingReview = "Pending Review",
Reviewed = "Reviewed",
Done = "Done"
}
Visningsværdien bliver så simpelthen f.eks. State.NotRequired.
Svar #2
Da enums ikke understøtter strengværdier, ville det være bedre at bruge en klasse med statiske felter som dette.
Du har kompileringskontrollerne, ligesom hvis du brugte enum, kalder du det på samme måde i din kode også.
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();
}
