Typescript-enum die een boolean-waarde per enum-instantie inkapselt
In Typescript, wat is de idiomatische manier om een booleaanse waarde toe te wijzen aan elke enum-instantie?
Stel dat ik een enum heb voor verschillende foutcodes. Voor elk van de foutcodes heb ik een boolean die aangeeft of de fout aan de eindgebruiker moet worden getoond of niet. In Java zou ik het doen zoals,
enum MyError {
ERROR1(true),
ERROR2(false),
ERROR3(false);
private boolean expose;
public boolean shouldExpose() {
return expose;
}
MyError(boolean expose) {
this.expose = expose;
}
}
Hier wordt de booleaanse informatie (of de fout aan de gebruiker moet worden getoond of niet) ingekapseld binnen de enum zelf.
MyError myError = MyError.ERROR1;
System.out.println(myError.shouldExpose()); //true
Hoe kan ik dit doen in Typescript aangezien TS geen boolean-waarden in enums toestaat? Moet ik hier een class of een type gebruiken?
Het doel is om de booleaanse informatie te hebben die in de enum/klasse/type is opgenomen. Daarom wil ik geen wrapper-type maken zoals
{
error: MyError
expose: boolean
}
omdat het kan leiden tot verkeerde configuratie/indelingen (het wordt mogelijk om MyError.ERROR1 te hebben met expose als false of omgekeerd voor andere fouten).
Antwoord #1
Je wilt misschien op echte enums verzichten en in plaats daarvan je eigen set constanten maken. Het is omslachtiger, maar het kan aan je behoeften voldoen.
const MyError = {
error1: {
name: 'ERROR1',
expose: true
},
error2: {
name: 'ERROR2',
expose: false
},
error3: {
name: 'ERROR3',
expose: false
}
} as const;
type MyError = typeof MyError[keyof typeof MyError]
function x(err: MyError) {
console.log(err);
}
x(MyError.error1);
x({name: 'ERROR1', expose: true});
x({name: 'ERROR1', expose: false}); // EXPECTED ERROR
function getError(): MyError {
return MyError.error1;
}
var e: MyError = getError();
console.log(MyError.error1 == e); // true
console.log(MyError.error2 == e); // false
Speeltuinlink
Antwoord #2
Als je niet geeft om de numerieke volgorde, dan kun je numerieke enums gebruiken, bijvoorbeeld.
enum MyError {
ERROR1 = 1,
ERROR2 = 0,
ERROR3 = 0,
}
console.log(MyError.ERROR1); // 1 == true
console.log(MyError.ERROR2); // 0 == false
console.log(MyError.ERROR3); // 0 == false
console.log(Boolean(MyError.ERROR1)); // true
console.log(Boolean(MyError.ERROR2)); // false
console.log(Boolean(MyError.ERROR3)); // false
BEWERKEN :
Je zou bijvoorbeeld namespace-samenvoeging kunnen gebruiken
namespace MyError {
export function shouldExpose(error:MyError) {
return Boolean(error);
}
}
console.log(MyError.shouldExpose(MyError.ERROR1)); // true
